From a0922dd8e4f3eb351edf8b7e47b38b674180bbdf Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Tue, 17 Oct 2017 10:33:46 -0700 Subject: [PATCH 001/210] Initial Rails Setup --- .gitignore | 19 + Gemfile | 67 ++ Gemfile.lock | 232 +++++ Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 18 + app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/_settings.scss | 863 ++++++++++++++++++ app/assets/stylesheets/application.css | 17 + .../stylesheets/foundation_and_overrides.scss | 57 ++ app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 3 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 19 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 38 + bin/spring | 17 + bin/update | 29 + bin/yarn | 11 + config.ru | 5 + config/application.rb | 25 + config/boot.rb | 3 + config/cable.yml | 10 + config/database.yml | 85 ++ config/environment.rb | 5 + config/environments/development.rb | 54 ++ config/environments/production.rb | 91 ++ config/environments/test.rb | 42 + .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 + config/puma.rb | 56 ++ config/routes.rb | 3 + config/secrets.yml | 32 + config/spring.rb | 6 + db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 ++ public/422.html | 67 ++ public/500.html | 66 ++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 25 + tmp/.keep | 0 vendor/.keep | 0 77 files changed, 2231 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/_settings.scss create mode 100644 app/assets/stylesheets/application.css create mode 100644 app/assets/stylesheets/foundation_and_overrides.scss create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..82701fedc8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# 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 + +# 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 0000000000..5ab86d9376 --- /dev/null +++ b/Gemfile @@ -0,0 +1,67 @@ +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 + + +# 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' +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 'foundation-rails', '6.4.1.2' +group :development do + gem 'better_errors' + gem 'pry-rails' + gem 'binding_of_caller' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..70efec06c9 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,232 @@ +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) + babel-source (5.8.35) + babel-transpiler (0.7.0) + babel-source (>= 4.0, < 6) + execjs (~> 2.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.2) + 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) + crass (1.0.2) + debug_inspector (0.0.3) + erubi (1.7.0) + execjs (2.7.0) + ffi (1.9.18) + foundation-rails (6.4.1.2) + railties (>= 3.1.0) + sass (>= 3.3.0, < 3.5) + sprockets-es6 (>= 0.9.0) + globalid (0.4.0) + activesupport (>= 4.2.0) + 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.6.6) + mime-types (>= 1.16, < 4) + method_source (0.9.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_mime (0.1.4) + mini_portile2 (2.3.0) + 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 + multi_json (1.12.2) + nio4r (2.1.0) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + pg (0.21.0) + pry (0.11.1) + 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.1.0) + 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) + sass (3.4.25) + 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-es6 (0.9.2) + babel-source (>= 5.8.11) + babel-transpiler + sprockets (>= 3.0.0) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + 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.3) + thread_safe (~> 0.1) + uglifier (3.2.0) + execjs (>= 0.3.0, < 3) + web-console (3.5.1) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + 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 + better_errors + binding_of_caller + byebug + capybara (~> 2.13) + foundation-rails (= 6.4.1.2) + jbuilder (~> 2.5) + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + 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) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +BUNDLED WITH + 1.15.4 diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /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 0000000000..b16e53d6d5 --- /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 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..4f2cc0f55a --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,18 @@ +// 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 foundation +//= require turbolinks +//= require_tree . + +$(function(){ $(document).foundation(); }); diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..739aa5f022 --- /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 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss new file mode 100644 index 0000000000..b67ff00cdc --- /dev/null +++ b/app/assets/stylesheets/_settings.scss @@ -0,0 +1,863 @@ +// Foundation for Sites Settings +// ----------------------------- +// +// Table of Contents: +// +// 1. Global +// 2. Breakpoints +// 3. The Grid +// 4. Base Typography +// 5. Typography Helpers +// 6. Abide +// 7. Accordion +// 8. Accordion Menu +// 9. Badge +// 10. Breadcrumbs +// 11. Button +// 12. Button Group +// 13. Callout +// 14. Card +// 15. Close Button +// 16. Drilldown +// 17. Dropdown +// 18. Dropdown Menu +// 19. Flexbox Utilities +// 20. Forms +// 21. Label +// 22. Media Object +// 23. Menu +// 24. Meter +// 25. Off-canvas +// 26. Orbit +// 27. Pagination +// 28. Progress Bar +// 29. Prototype Arrow +// 30. Prototype Border-Box +// 31. Prototype Border-None +// 32. Prototype Bordered +// 33. Prototype Display +// 34. Prototype Font-Styling +// 35. Prototype List-Style-Type +// 36. Prototype Overflow +// 37. Prototype Position +// 38. Prototype Rounded +// 39. Prototype Separator +// 40. Prototype Shadow +// 41. Prototype Sizing +// 42. Prototype Spacing +// 43. Prototype Text-Decoration +// 44. Prototype Text-Transformation +// 45. Prototype Text-Utilities +// 46. Responsive Embed +// 47. Reveal +// 48. Slider +// 49. Switch +// 50. Table +// 51. Tabs +// 52. Thumbnail +// 53. Title Bar +// 54. Tooltip +// 55. Top Bar +// 56. Xy Grid + +@import 'util/util'; + +// 1. Global +// --------- + +$global-font-size: 100%; +$global-width: rem-calc(1200); +$global-lineheight: 1.5; +$foundation-palette: ( + primary: #1779ba, + secondary: #767676, + success: #3adb76, + warning: #ffae00, + alert: #cc4b37, +); +$light-gray: #e6e6e6; +$medium-gray: #cacaca; +$dark-gray: #8a8a8a; +$black: #0a0a0a; +$white: #fefefe; +$body-background: $white; +$body-font-color: $black; +$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; +$body-antialiased: true; +$global-margin: 1rem; +$global-padding: 1rem; +$global-position: 1rem; +$global-weight-normal: normal; +$global-weight-bold: bold; +$global-radius: 0; +$global-menu-padding: 0.7rem 1rem; +$global-menu-nested-margin: 1rem; +$global-text-direction: ltr; +$global-flexbox: true; +$global-prototype-breakpoints: false; +$global-color-pick-contrast-tolerance: 0; +$print-transparent-backgrounds: true; + +@include add-foundation-colors; + +// 2. Breakpoints +// -------------- + +$breakpoints: ( + small: 0, + medium: 640px, + large: 1024px, + xlarge: 1200px, + xxlarge: 1440px, +); +$print-breakpoint: large; +$breakpoint-classes: (small medium large); + +// 3. The Grid +// ----------- + +$grid-row-width: $global-width; +$grid-column-count: 12; +$grid-column-gutter: ( + small: 20px, + medium: 30px, +); +$grid-column-align-edge: true; +$grid-column-alias: 'columns'; +$block-grid-max: 8; + +// 4. Base Typography +// ------------------ + +$header-font-family: $body-font-family; +$header-font-weight: $global-weight-normal; +$header-font-style: normal; +$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace; +$header-color: inherit; +$header-lineheight: 1.4; +$header-margin-bottom: 0.5rem; +$header-styles: ( + small: ( + 'h1': ('font-size': 24), + 'h2': ('font-size': 20), + 'h3': ('font-size': 19), + 'h4': ('font-size': 18), + 'h5': ('font-size': 17), + 'h6': ('font-size': 16), + ), + medium: ( + 'h1': ('font-size': 48), + 'h2': ('font-size': 40), + 'h3': ('font-size': 31), + 'h4': ('font-size': 25), + 'h5': ('font-size': 20), + 'h6': ('font-size': 16), + ), +); +$header-text-rendering: optimizeLegibility; +$small-font-size: 80%; +$header-small-font-color: $medium-gray; +$paragraph-lineheight: 1.6; +$paragraph-margin-bottom: 1rem; +$paragraph-text-rendering: optimizeLegibility; +$code-color: $black; +$code-font-family: $font-family-monospace; +$code-font-weight: $global-weight-normal; +$code-background: $light-gray; +$code-border: 1px solid $medium-gray; +$code-padding: rem-calc(2 5 1); +$anchor-color: $primary-color; +$anchor-color-hover: scale-color($anchor-color, $lightness: -14%); +$anchor-text-decoration: none; +$anchor-text-decoration-hover: none; +$hr-width: $global-width; +$hr-border: 1px solid $medium-gray; +$hr-margin: rem-calc(20) auto; +$list-lineheight: $paragraph-lineheight; +$list-margin-bottom: $paragraph-margin-bottom; +$list-style-type: disc; +$list-style-position: outside; +$list-side-margin: 1.25rem; +$list-nested-side-margin: 1.25rem; +$defnlist-margin-bottom: 1rem; +$defnlist-term-weight: $global-weight-bold; +$defnlist-term-margin-bottom: 0.3rem; +$blockquote-color: $dark-gray; +$blockquote-padding: rem-calc(9 20 0 19); +$blockquote-border: 1px solid $medium-gray; +$cite-font-size: rem-calc(13); +$cite-color: $dark-gray; +$cite-pseudo-content: '\2014 \0020'; +$keystroke-font: $font-family-monospace; +$keystroke-color: $black; +$keystroke-background: $light-gray; +$keystroke-padding: rem-calc(2 4 0); +$keystroke-radius: $global-radius; +$abbr-underline: 1px dotted $black; + +// 5. Typography Helpers +// --------------------- + +$lead-font-size: $global-font-size * 1.25; +$lead-lineheight: 1.6; +$subheader-lineheight: 1.4; +$subheader-color: $dark-gray; +$subheader-font-weight: $global-weight-normal; +$subheader-margin-top: 0.2rem; +$subheader-margin-bottom: 0.5rem; +$stat-font-size: 2.5rem; + +// 6. Abide +// -------- + +$abide-inputs: true; +$abide-labels: true; +$input-background-invalid: get-color(alert); +$form-label-color-invalid: get-color(alert); +$input-error-color: get-color(alert); +$input-error-font-size: rem-calc(12); +$input-error-font-weight: $global-weight-bold; + +// 7. Accordion +// ------------ + +$accordion-background: $white; +$accordion-plusminus: true; +$accordion-title-font-size: rem-calc(12); +$accordion-item-color: $primary-color; +$accordion-item-background-hover: $light-gray; +$accordion-item-padding: 1.25rem 1rem; +$accordion-content-background: $white; +$accordion-content-border: 1px solid $light-gray; +$accordion-content-color: $body-font-color; +$accordion-content-padding: 1rem; + +// 8. Accordion Menu +// ----------------- + +$accordionmenu-padding: $global-menu-padding; +$accordionmenu-nested-margin: $global-menu-nested-margin; +$accordionmenu-submenu-padding: $accordionmenu-padding; +$accordionmenu-arrows: true; +$accordionmenu-arrow-color: $primary-color; +$accordionmenu-item-background: null; +$accordionmenu-border: null; +$accordionmenu-submenu-toggle-background: null; +$accordion-submenu-toggle-border: $accordionmenu-border; +$accordionmenu-submenu-toggle-width: 40px; +$accordionmenu-submenu-toggle-height: $accordionmenu-submenu-toggle-width; +$accordionmenu-arrow-size: 6px; + +// 9. Badge +// -------- + +$badge-background: $primary-color; +$badge-color: $white; +$badge-color-alt: $black; +$badge-palette: $foundation-palette; +$badge-padding: 0.3em; +$badge-minwidth: 2.1em; +$badge-font-size: 0.6rem; + +// 10. Breadcrumbs +// --------------- + +$breadcrumbs-margin: 0 0 $global-margin 0; +$breadcrumbs-item-font-size: rem-calc(11); +$breadcrumbs-item-color: $primary-color; +$breadcrumbs-item-color-current: $black; +$breadcrumbs-item-color-disabled: $medium-gray; +$breadcrumbs-item-margin: 0.75rem; +$breadcrumbs-item-uppercase: true; +$breadcrumbs-item-separator: true; +$breadcrumbs-item-separator-item: '/'; +$breadcrumbs-item-separator-item-rtl: '\\'; +$breadcrumbs-item-separator-color: $medium-gray; + +// 11. Button +// ---------- + +$button-font-family: inherit; +$button-padding: 0.85em 1em; +$button-margin: 0 0 $global-margin 0; +$button-fill: solid; +$button-background: $primary-color; +$button-background-hover: scale-color($button-background, $lightness: -15%); +$button-color: $white; +$button-color-alt: $black; +$button-radius: $global-radius; +$button-hollow-border-width: 1px; +$button-sizes: ( + tiny: 0.6rem, + small: 0.75rem, + default: 0.9rem, + large: 1.25rem, +); +$button-palette: $foundation-palette; +$button-opacity-disabled: 0.25; +$button-background-hover-lightness: -20%; +$button-hollow-hover-lightness: -50%; +$button-transition: background-color 0.25s ease-out, color 0.25s ease-out; + +// 12. Button Group +// ---------------- + +$buttongroup-margin: 1rem; +$buttongroup-spacing: 1px; +$buttongroup-child-selector: '.button'; +$buttongroup-expand-max: 6; +$buttongroup-radius-on-each: true; + +// 13. Callout +// ----------- + +$callout-background: $white; +$callout-background-fade: 85%; +$callout-border: 1px solid rgba($black, 0.25); +$callout-margin: 0 0 1rem 0; +$callout-padding: 1rem; +$callout-font-color: $body-font-color; +$callout-font-color-alt: $body-background; +$callout-radius: $global-radius; +$callout-link-tint: 30%; + +// 14. Card +// -------- + +$card-background: $white; +$card-font-color: $body-font-color; +$card-divider-background: $light-gray; +$card-border: 1px solid $light-gray; +$card-shadow: none; +$card-border-radius: $global-radius; +$card-padding: $global-padding; +$card-margin-bottom: $global-margin; + +// 15. Close Button +// ---------------- + +$closebutton-position: right top; +$closebutton-offset-horizontal: ( + small: 0.66rem, + medium: 1rem, +); +$closebutton-offset-vertical: ( + small: 0.33em, + medium: 0.5rem, +); +$closebutton-size: ( + small: 1.5em, + medium: 2em, +); +$closebutton-lineheight: 1; +$closebutton-color: $dark-gray; +$closebutton-color-hover: $black; + +// 16. Drilldown +// ------------- + +$drilldown-transition: transform 0.15s linear; +$drilldown-arrows: true; +$drilldown-padding: $global-menu-padding; +$drilldown-nested-margin: 0; +$drilldown-background: $white; +$drilldown-submenu-padding: $drilldown-padding; +$drilldown-submenu-background: $white; +$drilldown-arrow-color: $primary-color; +$drilldown-arrow-size: 6px; + +// 17. Dropdown +// ------------ + +$dropdown-padding: 1rem; +$dropdown-background: $body-background; +$dropdown-border: 1px solid $medium-gray; +$dropdown-font-size: 1rem; +$dropdown-width: 300px; +$dropdown-radius: $global-radius; +$dropdown-sizes: ( + tiny: 100px, + small: 200px, + large: 400px, +); + +// 18. Dropdown Menu +// ----------------- + +$dropdownmenu-arrows: true; +$dropdownmenu-arrow-color: $anchor-color; +$dropdownmenu-arrow-size: 6px; +$dropdownmenu-arrow-padding: 1.5rem; +$dropdownmenu-min-width: 200px; +$dropdownmenu-background: $white; +$dropdownmenu-submenu-background: $dropdownmenu-background; +$dropdownmenu-padding: $global-menu-padding; +$dropdownmenu-nested-margin: 0; +$dropdownmenu-submenu-padding: $dropdownmenu-padding; +$dropdownmenu-border: 1px solid $medium-gray; +$dropdown-menu-item-color-active: get-color(primary); +$dropdown-menu-item-background-active: transparent; + +// 19. Flexbox Utilities +// --------------------- + +$flex-source-ordering-count: 6; +$flexbox-responsive-breakpoints: true; + +// 20. Forms +// --------- + +$fieldset-border: 1px solid $medium-gray; +$fieldset-padding: rem-calc(20); +$fieldset-margin: rem-calc(18 0); +$legend-padding: rem-calc(0 3); +$form-spacing: rem-calc(16); +$helptext-color: $black; +$helptext-font-size: rem-calc(13); +$helptext-font-style: italic; +$input-prefix-color: $black; +$input-prefix-background: $light-gray; +$input-prefix-border: 1px solid $medium-gray; +$input-prefix-padding: 1rem; +$form-label-color: $black; +$form-label-font-size: rem-calc(14); +$form-label-font-weight: $global-weight-normal; +$form-label-line-height: 1.8; +$select-background: $white; +$select-triangle-color: $dark-gray; +$select-radius: $global-radius; +$input-color: $black; +$input-placeholder-color: $medium-gray; +$input-font-family: inherit; +$input-font-size: rem-calc(16); +$input-font-weight: $global-weight-normal; +$input-line-height: $global-lineheight; +$input-background: $white; +$input-background-focus: $white; +$input-background-disabled: $light-gray; +$input-border: 1px solid $medium-gray; +$input-border-focus: 1px solid $dark-gray; +$input-padding: $form-spacing / 2; +$input-shadow: inset 0 1px 2px rgba($black, 0.1); +$input-shadow-focus: 0 0 5px $medium-gray; +$input-cursor-disabled: not-allowed; +$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +$input-number-spinners: true; +$input-radius: $global-radius; +$form-button-radius: $global-radius; + +// 21. Label +// --------- + +$label-background: $primary-color; +$label-color: $white; +$label-color-alt: $black; +$label-palette: $foundation-palette; +$label-font-size: 0.8rem; +$label-padding: 0.33333rem 0.5rem; +$label-radius: $global-radius; + +// 22. Media Object +// ---------------- + +$mediaobject-margin-bottom: $global-margin; +$mediaobject-section-padding: $global-padding; +$mediaobject-image-width-stacked: 100%; + +// 23. Menu +// -------- + +$menu-margin: 0; +$menu-nested-margin: $global-menu-nested-margin; +$menu-items-padding: $global-menu-padding; +$menu-simple-margin: 1rem; +$menu-item-color-active: $white; +$menu-item-background-active: get-color(primary); +$menu-icon-spacing: 0.25rem; +$menu-item-background-hover: $light-gray; +$menu-state-back-compat: true; +$menu-centered-back-compat: true; + +// 24. Meter +// --------- + +$meter-height: 1rem; +$meter-radius: $global-radius; +$meter-background: $medium-gray; +$meter-fill-good: $success-color; +$meter-fill-medium: $warning-color; +$meter-fill-bad: $alert-color; + +// 25. Off-canvas +// -------------- + +$offcanvas-size: 250px; +$offcanvas-vertical-size: 250px; +$offcanvas-background: $light-gray; +$offcanvas-shadow: 0 0 10px rgba($black, 0.7); +$offcanvas-inner-shadow-size: 20px; +$offcanvas-inner-shadow-color: rgba($black, 0.25); +$offcanvas-overlay-zindex: 11; +$offcanvas-push-zindex: 12; +$offcanvas-overlap-zindex: 13; +$offcanvas-reveal-zindex: 12; +$offcanvas-transition-length: 0.5s; +$offcanvas-transition-timing: ease; +$offcanvas-fixed-reveal: true; +$offcanvas-exit-background: rgba($white, 0.25); +$maincontent-class: 'off-canvas-content'; + +// 26. Orbit +// --------- + +$orbit-bullet-background: $medium-gray; +$orbit-bullet-background-active: $dark-gray; +$orbit-bullet-diameter: 1.2rem; +$orbit-bullet-margin: 0.1rem; +$orbit-bullet-margin-top: 0.8rem; +$orbit-bullet-margin-bottom: 0.8rem; +$orbit-caption-background: rgba($black, 0.5); +$orbit-caption-padding: 1rem; +$orbit-control-background-hover: rgba($black, 0.5); +$orbit-control-padding: 1rem; +$orbit-control-zindex: 10; + +// 27. Pagination +// -------------- + +$pagination-font-size: rem-calc(14); +$pagination-margin-bottom: $global-margin; +$pagination-item-color: $black; +$pagination-item-padding: rem-calc(3 10); +$pagination-item-spacing: rem-calc(1); +$pagination-radius: $global-radius; +$pagination-item-background-hover: $light-gray; +$pagination-item-background-current: $primary-color; +$pagination-item-color-current: $white; +$pagination-item-color-disabled: $medium-gray; +$pagination-ellipsis-color: $black; +$pagination-mobile-items: false; +$pagination-mobile-current-item: false; +$pagination-arrows: true; + +// 28. Progress Bar +// ---------------- + +$progress-height: 1rem; +$progress-background: $medium-gray; +$progress-margin-bottom: $global-margin; +$progress-meter-background: $primary-color; +$progress-radius: $global-radius; + +// 29. Prototype Arrow +// ------------------- + +$prototype-arrow-directions: ( + down, + up, + right, + left +); +$prototype-arrow-size: 0.4375rem; +$prototype-arrow-color: $black; + +// 30. Prototype Border-Box +// ------------------------ + +$prototype-border-box-breakpoints: $global-prototype-breakpoints; + +// 31. Prototype Border-None +// ------------------------- + +$prototype-border-none-breakpoints: $global-prototype-breakpoints; + +// 32. Prototype Bordered +// ---------------------- + +$prototype-bordered-breakpoints: $global-prototype-breakpoints; +$prototype-border-width: rem-calc(1); +$prototype-border-type: solid; +$prototype-border-color: $medium-gray; + +// 33. Prototype Display +// --------------------- + +$prototype-display-breakpoints: $global-prototype-breakpoints; +$prototype-display: ( + inline, + inline-block, + block, + table, + table-cell +); + +// 34. Prototype Font-Styling +// -------------------------- + +$prototype-font-breakpoints: $global-prototype-breakpoints; +$prototype-wide-letter-spacing: rem-calc(4); +$prototype-font-normal: $global-weight-normal; +$prototype-font-bold: $global-weight-bold; + +// 35. Prototype List-Style-Type +// ----------------------------- + +$prototype-list-breakpoints: $global-prototype-breakpoints; +$prototype-style-type-unordered: ( + disc, + circle, + square +); +$prototype-style-type-ordered: ( + decimal, + lower-alpha, + lower-latin, + lower-roman, + upper-alpha, + upper-latin, + upper-roman +); + +// 36. Prototype Overflow +// ---------------------- + +$prototype-overflow-breakpoints: $global-prototype-breakpoints; +$prototype-overflow: ( + visible, + hidden, + scroll +); + +// 37. Prototype Position +// ---------------------- + +$prototype-position-breakpoints: $global-prototype-breakpoints; +$prototype-position: ( + static, + relative, + absolute, + fixed +); +$prototype-position-z-index: 975; + +// 38. Prototype Rounded +// --------------------- + +$prototype-rounded-breakpoints: $global-prototype-breakpoints; +$prototype-border-radius: rem-calc(3); + +// 39. Prototype Separator +// ----------------------- + +$prototype-separator-breakpoints: $global-prototype-breakpoints; +$prototype-separator-align: center; +$prototype-separator-height: rem-calc(2); +$prototype-separator-width: 3rem; +$prototype-separator-background: $primary-color; +$prototype-separator-margin-top: $global-margin; + +// 40. Prototype Shadow +// -------------------- + +$prototype-shadow-breakpoints: $global-prototype-breakpoints; +$prototype-box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), + 0 2px 10px 0 rgba(0,0,0,.12); + +// 41. Prototype Sizing +// -------------------- + +$prototype-sizing-breakpoints: $global-prototype-breakpoints; +$prototype-sizing: ( + width, + height +); +$prototype-sizes: ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100% +); + +// 42. Prototype Spacing +// --------------------- + +$prototype-spacing-breakpoints: $global-prototype-breakpoints; +$prototype-spacers-count: 3; + +// 43. Prototype Text-Decoration +// ----------------------------- + +$prototype-decoration-breakpoints: $global-prototype-breakpoints; +$prototype-text-decoration: ( + overline, + underline, + line-through, +); + +// 44. Prototype Text-Transformation +// --------------------------------- + +$prototype-transformation-breakpoints: $global-prototype-breakpoints; +$prototype-text-transformation: ( + lowercase, + uppercase, + capitalize +); + +// 45. Prototype Text-Utilities +// ---------------------------- + +$prototype-utilities-breakpoints: $global-prototype-breakpoints; +$prototype-text-overflow: ellipsis; + +// 46. Responsive Embed +// -------------------- + +$responsive-embed-margin-bottom: rem-calc(16); +$responsive-embed-ratios: ( + default: 4 by 3, + widescreen: 16 by 9, +); + +// 47. Reveal +// ---------- + +$reveal-background: $white; +$reveal-width: 600px; +$reveal-max-width: $global-width; +$reveal-padding: $global-padding; +$reveal-border: 1px solid $medium-gray; +$reveal-radius: $global-radius; +$reveal-zindex: 1005; +$reveal-overlay-background: rgba($black, 0.45); + +// 48. Slider +// ---------- + +$slider-width-vertical: 0.5rem; +$slider-transition: all 0.2s ease-in-out; +$slider-height: 0.5rem; +$slider-background: $light-gray; +$slider-fill-background: $medium-gray; +$slider-handle-height: 1.4rem; +$slider-handle-width: 1.4rem; +$slider-handle-background: $primary-color; +$slider-opacity-disabled: 0.25; +$slider-radius: $global-radius; + +// 49. Switch +// ---------- + +$switch-background: $medium-gray; +$switch-background-active: $primary-color; +$switch-height: 2rem; +$switch-height-tiny: 1.5rem; +$switch-height-small: 1.75rem; +$switch-height-large: 2.5rem; +$switch-radius: $global-radius; +$switch-margin: $global-margin; +$switch-paddle-background: $white; +$switch-paddle-offset: 0.25rem; +$switch-paddle-radius: $global-radius; +$switch-paddle-transition: all 0.25s ease-out; + +// 50. Table +// --------- + +$table-background: $white; +$table-color-scale: 5%; +$table-border: 1px solid smart-scale($table-background, $table-color-scale); +$table-padding: rem-calc(8 10 10); +$table-hover-scale: 2%; +$table-row-hover: darken($table-background, $table-hover-scale); +$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale); +$table-is-striped: true; +$table-striped-background: smart-scale($table-background, $table-color-scale); +$table-stripe: even; +$table-head-background: smart-scale($table-background, $table-color-scale / 2); +$table-head-row-hover: darken($table-head-background, $table-hover-scale); +$table-foot-background: smart-scale($table-background, $table-color-scale); +$table-foot-row-hover: darken($table-foot-background, $table-hover-scale); +$table-head-font-color: $body-font-color; +$table-foot-font-color: $body-font-color; +$show-header-for-stacked: false; +$table-stack-breakpoint: medium; + +// 51. Tabs +// -------- + +$tab-margin: 0; +$tab-background: $white; +$tab-color: $primary-color; +$tab-background-active: $light-gray; +$tab-active-color: $primary-color; +$tab-item-font-size: rem-calc(12); +$tab-item-background-hover: $white; +$tab-item-padding: 1.25rem 1.5rem; +$tab-expand-max: 6; +$tab-content-background: $white; +$tab-content-border: $light-gray; +$tab-content-color: $body-font-color; +$tab-content-padding: 1rem; + +// 52. Thumbnail +// ------------- + +$thumbnail-border: solid 4px $white; +$thumbnail-margin-bottom: $global-margin; +$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2); +$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); +$thumbnail-transition: box-shadow 200ms ease-out; +$thumbnail-radius: $global-radius; + +// 53. Title Bar +// ------------- + +$titlebar-background: $black; +$titlebar-color: $white; +$titlebar-padding: 0.5rem; +$titlebar-text-font-weight: bold; +$titlebar-icon-color: $white; +$titlebar-icon-color-hover: $medium-gray; +$titlebar-icon-spacing: 0.25rem; + +// 54. Tooltip +// ----------- + +$has-tip-cursor: help; +$has-tip-font-weight: $global-weight-bold; +$has-tip-border-bottom: dotted 1px $dark-gray; +$tooltip-background-color: $black; +$tooltip-color: $white; +$tooltip-padding: 0.75rem; +$tooltip-max-width: 10rem; +$tooltip-font-size: $small-font-size; +$tooltip-pip-width: 0.75rem; +$tooltip-pip-height: $tooltip-pip-width * 0.866; +$tooltip-radius: $global-radius; + +// 55. Top Bar +// ----------- + +$topbar-padding: 0.5rem; +$topbar-background: $light-gray; +$topbar-submenu-background: $topbar-background; +$topbar-title-spacing: 0.5rem 1rem 0.5rem 0; +$topbar-input-width: 200px; +$topbar-unstack-breakpoint: medium; + +// 56. Xy Grid +// ----------- + +$xy-grid: true; +$grid-container: $global-width; +$grid-columns: 12; +$grid-margin-gutters: ( + small: 20px, + medium: 30px +); +$grid-padding-gutters: $grid-margin-gutters; +$grid-container-padding: $grid-padding-gutters; +$grid-container-max: $global-width; +$block-grid-max: 8; + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..a152282fce --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,17 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + *= require foundation_and_overrides + + */ diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss new file mode 100644 index 0000000000..7ea2975d7e --- /dev/null +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -0,0 +1,57 @@ +@charset 'utf-8'; + +@import 'settings'; +@import 'foundation'; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +// @import 'motion-ui/motion-ui'; + +// We include everything by default. To slim your CSS, remove components you don't use. + +@include foundation-global-styles; +@include foundation-grid; +@include foundation-typography; +@include foundation-button; +@include foundation-forms; +@include foundation-visibility-classes; +@include foundation-float-classes; +@include foundation-accordion; +@include foundation-accordion-menu; +@include foundation-badge; +@include foundation-breadcrumbs; +@include foundation-button-group; +@include foundation-callout; +@include foundation-card; +@include foundation-close-button; +@include foundation-drilldown-menu; +@include foundation-dropdown; +@include foundation-dropdown-menu; +@include foundation-responsive-embed; +@include foundation-label; +@include foundation-media-object; +@include foundation-menu; +@include foundation-menu-icon; +@include foundation-off-canvas; +@include foundation-orbit; +@include foundation-pagination; +@include foundation-progress-bar; +@include foundation-slider; +@include foundation-sticky; +@include foundation-reveal; +@include foundation-switch; +@include foundation-table; +@include foundation-tabs; +@include foundation-thumbnail; +@include foundation-title-bar; +@include foundation-tooltip; +@include foundation-top-bar; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +// @include motion-ui-transitions; +// @include motion-ui-animations; +@import 'motion-ui/motion-ui'; +@include motion-ui-transitions; +@include motion-ui-animations; + diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..1c07694e9d --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,3 @@ +class ApplicationController < ActionController::Base + protect_from_forgery with: :exception +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..cd60004891 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,19 @@ + + + + + + + <%= content_for?(:title) ? yield(:title) : "Untitled" %> + + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + + + <%= yield %> + + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000000..66e9889e8b --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..d87d5f5781 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..78c4e861dc --- /dev/null +++ b/bin/setup @@ -0,0 +1,38 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000000..fb2ec2ebb4 --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 0000000000..a8e4462f20 --- /dev/null +++ b/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..c2bacef836 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +VENDOR_PATH = File.expand_path('..', __dir__) +Dir.chdir(VENDOR_PATH) do + begin + exec "yarnpkg #{ARGV.join(" ")}" + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..a47233460d --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Betsy + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.1 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..30f5120df6 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..3cba994bb2 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 + channel_prefix: betsy_production diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..6903bb6083 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: betsy_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: betsy + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: betsy_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: betsy_production + username: betsy + password: <%= ENV['BETSY_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..5187e22186 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,54 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..9284f84839 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,91 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Attempt to read encrypted secrets from `config/secrets.yml.enc`. + # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or + # `config/secrets.yml.key`. + config.read_encrypted_secrets = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "betsy_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..8e5cbde533 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.seconds.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..decc5a8573 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..1e19380dcb --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,56 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# If you are preloading your application and using Active Record, it's +# recommended that you close any connections to the database before workers +# are forked to prevent connection leakage. +# +# before_fork do +# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) +# end + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted, this block will be run. If you are using the `preload_app!` +# option, you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, as Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end +# + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..787824f888 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 0000000000..6c85239306 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,32 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +# Shared secrets are available across all environments. + +# shared: +# api_key: a1B2c3D4e5F6 + +# Environmental secrets are only available for that specific environment. + +development: + secret_key_base: 68bb246ed097645198656753e163fd6fa9feb15482ca49c0b9cc250013ee665548ff66dce1ffc81b4c1fcd9c48986ca3444edd67c83ed9e7f1145c53c7dd2b3d + +test: + secret_key_base: e352ccc32555d0d7451a109601441e05ac433439736ea360cdad6086e351720a3e2ceef986e243c0042d93d09e659734878154a4524e64557bc5c61b0d8dd478 + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..c9119b40c0 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f874acf437 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "betsy", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..37b576a4a0 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..f8e01da98e --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,25 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails"require "minitest/reporters" # for Colorized output + +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 From 6949db6947bae7b2e10086f5afed724e5c5196ab Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Tue, 17 Oct 2017 14:18:14 -0700 Subject: [PATCH 002/210] Generate initial models --- app/models/category.rb | 2 + app/models/merchant.rb | 2 + app/models/order.rb | 2 + app/models/product.rb | 2 + app/models/products_category.rb | 2 + app/models/review.rb | 2 + db/migrate/20171017205403_create_merchants.rb | 9 +++ db/migrate/20171017205415_create_products.rb | 11 +++ db/migrate/20171017205439_create_orders.rb | 15 ++++ .../20171017205452_create_categories.rb | 8 ++ db/migrate/20171017205519_create_reviews.rb | 10 +++ ...7211418_create_products_categories_join.rb | 8 ++ ...71017211619_create_orders_products_join.rb | 8 ++ db/schema.rb | 77 +++++++++++++++++++ test/fixtures/categories.yml | 11 +++ test/fixtures/merchants.yml | 11 +++ test/fixtures/orders.yml | 11 +++ test/fixtures/products.yml | 11 +++ test/fixtures/products_categories.yml | 11 +++ test/fixtures/reviews.yml | 11 +++ test/models/category_test.rb | 9 +++ test/models/merchant_test.rb | 9 +++ test/models/order_test.rb | 9 +++ test/models/product_test.rb | 9 +++ test/models/products_category_test.rb | 9 +++ test/models/review_test.rb | 9 +++ 26 files changed, 278 insertions(+) create mode 100644 app/models/category.rb create mode 100644 app/models/merchant.rb create mode 100644 app/models/order.rb create mode 100644 app/models/product.rb create mode 100644 app/models/products_category.rb create mode 100644 app/models/review.rb create mode 100644 db/migrate/20171017205403_create_merchants.rb create mode 100644 db/migrate/20171017205415_create_products.rb create mode 100644 db/migrate/20171017205439_create_orders.rb create mode 100644 db/migrate/20171017205452_create_categories.rb create mode 100644 db/migrate/20171017205519_create_reviews.rb create mode 100644 db/migrate/20171017211418_create_products_categories_join.rb create mode 100644 db/migrate/20171017211619_create_orders_products_join.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/categories.yml create mode 100644 test/fixtures/merchants.yml create mode 100644 test/fixtures/orders.yml create mode 100644 test/fixtures/products.yml create mode 100644 test/fixtures/products_categories.yml create mode 100644 test/fixtures/reviews.yml create mode 100644 test/models/category_test.rb create mode 100644 test/models/merchant_test.rb create mode 100644 test/models/order_test.rb create mode 100644 test/models/product_test.rb create mode 100644 test/models/products_category_test.rb create mode 100644 test/models/review_test.rb diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..54cb6aee3f --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,2 @@ +class Category < ApplicationRecord +end diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..0440407160 --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,2 @@ +class Merchant < ApplicationRecord +end diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..10281b3450 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,2 @@ +class Order < ApplicationRecord +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..35a85acab3 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,2 @@ +class Product < ApplicationRecord +end diff --git a/app/models/products_category.rb b/app/models/products_category.rb new file mode 100644 index 0000000000..cc56982227 --- /dev/null +++ b/app/models/products_category.rb @@ -0,0 +1,2 @@ +class ProductsCategory < ApplicationRecord +end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..b2ca4935ed --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,2 @@ +class Review < ApplicationRecord +end diff --git a/db/migrate/20171017205403_create_merchants.rb b/db/migrate/20171017205403_create_merchants.rb new file mode 100644 index 0000000000..824068f3d8 --- /dev/null +++ b/db/migrate/20171017205403_create_merchants.rb @@ -0,0 +1,9 @@ +class CreateMerchants < ActiveRecord::Migration[5.1] + def change + create_table :merchants do |t| + t.string :username, null: false + t.string :email, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20171017205415_create_products.rb b/db/migrate/20171017205415_create_products.rb new file mode 100644 index 0000000000..02472100c8 --- /dev/null +++ b/db/migrate/20171017205415_create_products.rb @@ -0,0 +1,11 @@ +class CreateProducts < ActiveRecord::Migration[5.1] + def change + create_table :products do |t| + t.string :name + t.decimal :price + t.integer :quantity_avail + t.belongs_to :merchant, index: true + t.timestamps + end + end +end diff --git a/db/migrate/20171017205439_create_orders.rb b/db/migrate/20171017205439_create_orders.rb new file mode 100644 index 0000000000..fd39d8fe12 --- /dev/null +++ b/db/migrate/20171017205439_create_orders.rb @@ -0,0 +1,15 @@ +class CreateOrders < ActiveRecord::Migration[5.1] + def change + create_table :orders do |t| + t.string :status + t.string :email + t.string :address + t.string :name + t.string :card_number + t.string :card_exp + t.string :card_cvv + t.string :zip_code + t.timestamps + end + end +end diff --git a/db/migrate/20171017205452_create_categories.rb b/db/migrate/20171017205452_create_categories.rb new file mode 100644 index 0000000000..c7c46b747a --- /dev/null +++ b/db/migrate/20171017205452_create_categories.rb @@ -0,0 +1,8 @@ +class CreateCategories < ActiveRecord::Migration[5.1] + def change + create_table :categories do |t| + t.string :name + t.timestamps + end + end +end diff --git a/db/migrate/20171017205519_create_reviews.rb b/db/migrate/20171017205519_create_reviews.rb new file mode 100644 index 0000000000..cfdf936c8f --- /dev/null +++ b/db/migrate/20171017205519_create_reviews.rb @@ -0,0 +1,10 @@ +class CreateReviews < ActiveRecord::Migration[5.1] + def change + create_table :reviews do |t| + t.integer :rating + t.string :text_review + t.belongs_to :product, index: true + t.timestamps + end + end +end diff --git a/db/migrate/20171017211418_create_products_categories_join.rb b/db/migrate/20171017211418_create_products_categories_join.rb new file mode 100644 index 0000000000..3af322f986 --- /dev/null +++ b/db/migrate/20171017211418_create_products_categories_join.rb @@ -0,0 +1,8 @@ +class CreateProductsCategoriesJoin < ActiveRecord::Migration[5.1] + def change + create_table :products_categories do |t| + t.belongs_to :product, index: true + t.belongs_to :category, index: true + end + end +end diff --git a/db/migrate/20171017211619_create_orders_products_join.rb b/db/migrate/20171017211619_create_orders_products_join.rb new file mode 100644 index 0000000000..ff97b17c90 --- /dev/null +++ b/db/migrate/20171017211619_create_orders_products_join.rb @@ -0,0 +1,8 @@ +class CreateOrdersProductsJoin < ActiveRecord::Migration[5.1] + def change + create_table :orders_products do |t| + t.belongs_to :product, index: true + t.belongs_to :order, index: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..ee07037392 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,77 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20171017211619) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "categories", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "merchants", force: :cascade do |t| + t.string "username", null: false + t.string "email", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "orders", force: :cascade do |t| + t.string "status" + t.string "email" + t.string "address" + t.string "name" + t.string "card_number" + t.string "card_exp" + t.string "card_cvv" + t.string "zip_code" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "orders_products", force: :cascade do |t| + t.bigint "product_id" + t.bigint "order_id" + t.index ["order_id"], name: "index_orders_products_on_order_id" + t.index ["product_id"], name: "index_orders_products_on_product_id" + end + + create_table "products", force: :cascade do |t| + t.string "name" + t.decimal "price" + t.integer "quantity_avail" + t.bigint "merchant_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["merchant_id"], name: "index_products_on_merchant_id" + end + + create_table "products_categories", force: :cascade do |t| + t.bigint "product_id" + t.bigint "category_id" + t.index ["category_id"], name: "index_products_categories_on_category_id" + t.index ["product_id"], name: "index_products_categories_on_product_id" + end + + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "text_review" + t.bigint "product_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["product_id"], name: "index_reviews_on_product_id" + end + +end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/products_categories.yml b/test/fixtures/products_categories.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/products_categories.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 0000000000..781320ad8e --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Category do + let(:category) { Category.new } + + it "must be valid" do + value(category).must_be :valid? + end +end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb new file mode 100644 index 0000000000..1cc99d985f --- /dev/null +++ b/test/models/merchant_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Merchant do + let(:merchant) { Merchant.new } + + it "must be valid" do + value(merchant).must_be :valid? + end +end diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..df80f10fb6 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Order do + let(:order) { Order.new } + + it "must be valid" do + value(order).must_be :valid? + end +end diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000000..a618b0a156 --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Product do + let(:product) { Product.new } + + it "must be valid" do + value(product).must_be :valid? + end +end diff --git a/test/models/products_category_test.rb b/test/models/products_category_test.rb new file mode 100644 index 0000000000..f2c72224e4 --- /dev/null +++ b/test/models/products_category_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe ProductsCategory do + let(:products_category) { ProductsCategory.new } + + it "must be valid" do + value(products_category).must_be :valid? + end +end diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000..ce8378a033 --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Review do + let(:review) { Review.new } + + it "must be valid" do + value(review).must_be :valid? + end +end From b1fbb73c6881fa254a5392673f5bf4b3b5443b39 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Tue, 17 Oct 2017 14:26:18 -0700 Subject: [PATCH 003/210] Controllers & routes. --- app/assets/javascripts/categories.js | 2 ++ app/assets/javascripts/merchants.js | 2 ++ app/assets/javascripts/orders.js | 2 ++ app/assets/javascripts/products.js | 2 ++ app/assets/javascripts/reviews.js | 2 ++ app/assets/stylesheets/categories.scss | 3 +++ app/assets/stylesheets/merchants.scss | 3 +++ app/assets/stylesheets/orders.scss | 3 +++ app/assets/stylesheets/products.scss | 3 +++ app/assets/stylesheets/reviews.scss | 3 +++ app/controllers/categories_controller.rb | 2 ++ app/controllers/merchants_controller.rb | 2 ++ app/controllers/orders_controller.rb | 2 ++ app/controllers/products_controller.rb | 2 ++ app/controllers/reviews_controller.rb | 2 ++ app/helpers/categories_helper.rb | 2 ++ app/helpers/merchants_helper.rb | 2 ++ app/helpers/orders_helper.rb | 2 ++ app/helpers/products_helper.rb | 2 ++ app/helpers/reviews_helper.rb | 2 ++ app/views/products/root.html.erb | 0 config/routes.rb | 9 +++++++++ test/controllers/categories_controller_test.rb | 7 +++++++ test/controllers/merchants_controller_test.rb | 7 +++++++ test/controllers/orders_controller_test.rb | 7 +++++++ test/controllers/products_controller_test.rb | 7 +++++++ test/controllers/reviews_controller_test.rb | 7 +++++++ 27 files changed, 89 insertions(+) create mode 100644 app/assets/javascripts/categories.js create mode 100644 app/assets/javascripts/merchants.js create mode 100644 app/assets/javascripts/orders.js create mode 100644 app/assets/javascripts/products.js create mode 100644 app/assets/javascripts/reviews.js create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 app/views/products/root.html.erb create mode 100644 test/controllers/categories_controller_test.rb create mode 100644 test/controllers/merchants_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/controllers/reviews_controller_test.rb diff --git a/app/assets/javascripts/categories.js b/app/assets/javascripts/categories.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/categories.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/merchants.js b/app/assets/javascripts/merchants.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/merchants.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/orders.js b/app/assets/javascripts/orders.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/orders.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/products.js b/app/assets/javascripts/products.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/products.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/reviews.js b/app/assets/javascripts/reviews.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/reviews.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..42976cbc11 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss new file mode 100644 index 0000000000..f4c164d600 --- /dev/null +++ b/app/assets/stylesheets/merchants.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Merchants controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..741506954d --- /dev/null +++ b/app/assets/stylesheets/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..bff386e55a --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..11bbb12cd5 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..a14959525a --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,2 @@ +class CategoriesController < ApplicationController +end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb new file mode 100644 index 0000000000..ae95f7677b --- /dev/null +++ b/app/controllers/merchants_controller.rb @@ -0,0 +1,2 @@ +class MerchantsController < ApplicationController +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..8a0e3659ae --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,2 @@ +class OrdersController < ApplicationController +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..f1ad12ddea --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,2 @@ +class ProductsController < ApplicationController +end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..b3d77cc1c3 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,2 @@ +class ReviewsController < ApplicationController +end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb new file mode 100644 index 0000000000..5337747b0f --- /dev/null +++ b/app/helpers/merchants_helper.rb @@ -0,0 +1,2 @@ +module MerchantsHelper +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 0000000000..443227fd48 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,2 @@ +module OrdersHelper +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/routes.rb b/config/routes.rb index 787824f888..2a04d7bf03 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,12 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + root 'products#root' + + + resources :categories + resources :merchants + resources :orders + resources :products + resources :reviews + end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..125dd4c91d --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CategoriesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb new file mode 100644 index 0000000000..6eb57f7baa --- /dev/null +++ b/test/controllers/merchants_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MerchantsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..68784595f3 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrdersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..392a20e292 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ProductsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..386065239a --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ReviewsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From d1e26c22f217035a8573a769ee070d6bdc5e1b34 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Tue, 17 Oct 2017 15:45:59 -0700 Subject: [PATCH 004/210] added relationships to models --- app/models/category.rb | 1 + app/models/merchant.rb | 1 + app/models/order.rb | 1 + app/models/product.rb | 5 +++++ app/models/products_category.rb | 2 -- 5 files changed, 8 insertions(+), 2 deletions(-) delete mode 100644 app/models/products_category.rb diff --git a/app/models/category.rb b/app/models/category.rb index 54cb6aee3f..f3218758f1 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,2 +1,3 @@ class Category < ApplicationRecord + has_and_belongs_to_many :products end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 0440407160..07aacc445d 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,2 +1,3 @@ class Merchant < ApplicationRecord + has_many :products end diff --git a/app/models/order.rb b/app/models/order.rb index 10281b3450..6ca855ee53 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,2 +1,3 @@ class Order < ApplicationRecord + has_and_belongs_to_many :products end diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..953470b0d0 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,7 @@ class Product < ApplicationRecord + belongs_to :user + has_many :reviews + has_and_belongs_to_many :categories + has_and_belongs_to_many :orders + end diff --git a/app/models/products_category.rb b/app/models/products_category.rb deleted file mode 100644 index cc56982227..0000000000 --- a/app/models/products_category.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ProductsCategory < ApplicationRecord -end From 5c70d27959305088a52277a05f2fca5092d235cb Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Tue, 17 Oct 2017 16:19:37 -0700 Subject: [PATCH 005/210] Categories controller actions. --- app/controllers/categories_controller.rb | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index a14959525a..a5eb3088ef 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,2 +1,41 @@ class CategoriesController < ApplicationController + + def index + @categories = Category.all + end + + def new + @category = Category.new + end + + def create + @category = Category.new(name: params[:category][:name]) + if @category.save + flash[:status] = :success + flash[:result_text] = "Successfully created #{@category.name} category" + redirect_to category_path + else + flash[:status] = :failure + flash[:result_text] = "Could not create #{@category.name} category." + flash[:messages] = @category.errors.messages + render :new, status: :bad_request + end + end + + def show + @category = Category.find_by(id: params[:id]) + end + + def destroy + @category = Category.find_by(id: params[:id]) + if @category.destroy + flash[:status] = :success + flash[:result_text] = "Category deleted" + redirect_to categories_path + else + flash[:status] = :failure + flash[:result_text] = "That category is unable to be deleted." + end + end + end From 6de843091f73d12c76a26f37477b49204509e0eb Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Tue, 17 Oct 2017 16:26:48 -0700 Subject: [PATCH 006/210] Add CRUD actions to merchant and associated views --- app/controllers/merchants_controller.rb | 52 +++++++++++++++++++++++++ app/views/merchants/_form.html.erb | 1 + app/views/merchants/edit.html.erb | 2 + app/views/merchants/index.html.erb | 1 + app/views/merchants/new.html.erb | 2 + app/views/merchants/show.html.erb | 1 + 6 files changed, 59 insertions(+) create mode 100644 app/views/merchants/_form.html.erb create mode 100644 app/views/merchants/edit.html.erb create mode 100644 app/views/merchants/index.html.erb create mode 100644 app/views/merchants/new.html.erb create mode 100644 app/views/merchants/show.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ae95f7677b..905a2ffef0 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,2 +1,54 @@ class MerchantsController < ApplicationController + def index + @merchants = Merchant.all + end + + def new + @merchant = Merchant.new + end + + def create + @merchant = Merchant.new merchant_params + if @merchant.save + flash[:success] = "Successfully created new merchant!" + redirect_to merchant_path(@merchant.id) + else + flash.now[:error] = "Could not create new merchant." + render :new + end + end + + def show + @merchant = Merchant.find( params[:id].to_i ) + end + + def edit + @merchant = Merchant.find_by(id: params[:id].to_i) + + unless @merchant + redirect_to root_path + end + end + + def update + @merchant = Merchant.find_by(id: params[:id].to_i) + redirect_to root_path unless @merchant + + if @merchant.update_attributes merchant_params + redirect_to root_path + else + render :edit + end + end + + def destroy + Merchant.find_by(id: params[:id]).destroy + redirect_to root_path + end + + private + + def merchant_params + return params.require(:merchant).permit(:username, :email) + end end diff --git a/app/views/merchants/_form.html.erb b/app/views/merchants/_form.html.erb new file mode 100644 index 0000000000..3885c000a8 --- /dev/null +++ b/app/views/merchants/_form.html.erb @@ -0,0 +1 @@ +

Partial Form

diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb new file mode 100644 index 0000000000..6a0b07d589 --- /dev/null +++ b/app/views/merchants/edit.html.erb @@ -0,0 +1,2 @@ +

Merchants#edit

+<%= render partial: "form" %> diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..4ac2964df7 --- /dev/null +++ b/app/views/merchants/index.html.erb @@ -0,0 +1 @@ +

Merchants#index

diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb new file mode 100644 index 0000000000..583476d688 --- /dev/null +++ b/app/views/merchants/new.html.erb @@ -0,0 +1,2 @@ +

Merchants#new

+<%= render partial: "form" %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..2603c9319b --- /dev/null +++ b/app/views/merchants/show.html.erb @@ -0,0 +1 @@ +

Merchants#show

From b5e1f011ee2fcb9f3ef0401f33b65310facac98c Mon Sep 17 00:00:00 2001 From: mcgmar <30788451+mcgmar@users.noreply.github.com> Date: Tue, 17 Oct 2017 16:31:05 -0700 Subject: [PATCH 007/210] Adding seeds file for merchant --- merchant_seeds.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 merchant_seeds.csv diff --git a/merchant_seeds.csv b/merchant_seeds.csv new file mode 100644 index 0000000000..e94cd55a72 --- /dev/null +++ b/merchant_seeds.csv @@ -0,0 +1,11 @@ +username,email +Wiccan Loans,moneynow@ghoulmail.com +Broom With A View,broomtastick@ghoulmail.com +Crone Jewels,jewellyc@zombiepost.com +Potion Our Wares,wareyouout@ghoulmail.com +Quality Curses and Tote Hags,carryusaround@zombiepost.com +The Dark Markdown,whoknows@ghoulmail.com +Toadally Original,toadtastic@zombiepost.com +Sit and Browse a Spell,browsing@ghoulmail.com +Spell It Out,spellitout@zombiepost.com +Brews and Ghouls,bandg@zombiepost.com \ No newline at end of file From f24311d0df6e5c9b95a9e7fc255396fd82cf0042 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Tue, 17 Oct 2017 16:38:15 -0700 Subject: [PATCH 008/210] Reviews controller actions. --- app/controllers/reviews_controller.rb | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index b3d77cc1c3..abfda15275 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,2 +1,39 @@ class ReviewsController < ApplicationController + def index + @reviews = Review.all + end + + def new + @review = Review.new(product_id: params[:product_id]) + end + + def create + @review = Review.new(product_id: params[:review][:product_id], text_review: params[:review][:text_review], rating: [:review][:rating]) + if @review.save + flash[:status] = :success + flash[:result_text] = "Successfully reviewed!" + redirect_to product_path(@review.product_id) + else + flash[:status] = :failure + flash[:result_text] = "Could not review this product." + flash[:messages] = @review.errors.messages + render :new, status: :bad_request + end + end + + def show + @review = Review.find_by(id: params[:id]) + end + + def destroy + @review = Review.find_by(id: params[:id]) + if @review.destroy + flash[:status] = :success + flash[:result_text] = "Review deleted" + redirect_to products_path + else + flash[:status] = :failure + flash[:result_text] = "That review is unable to be deleted." + end + end end From 14888b3189b91ca85beabe72094f7444e8d9e008 Mon Sep 17 00:00:00 2001 From: mcgmar <30788451+mcgmar@users.noreply.github.com> Date: Tue, 17 Oct 2017 16:50:44 -0700 Subject: [PATCH 009/210] products seeds file --- products.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 products.csv diff --git a/products.csv b/products.csv new file mode 100644 index 0000000000..4ad2bf6bfb --- /dev/null +++ b/products.csv @@ -0,0 +1,11 @@ +name,price,quantity_avail +toad stools,9.99,3 +witches brew,2.99,10 +wart cream,5.99,2 +gold cauldron,2.99,5 +The Book of Incredible Curses,17.99,12 +How to Prepare Frog Legs for All,18.99,3 +silk robe,35.99,6 +disappearing flask,10.99,4 +cough resistant spooky smog,23.99,8 +Spells to Cast for Good or Evil,16.99,5 \ No newline at end of file From b7fbe3294059c1470417cafb0dd57e6cda52a4d2 Mon Sep 17 00:00:00 2001 From: Sara C Date: Tue, 17 Oct 2017 16:58:10 -0700 Subject: [PATCH 010/210] SC updating orders controller unfinished --- app/controllers/orders_controller.rb | 53 ++++++++++++++++++++++++++++ app/views/orders/_form.html.erb | 0 app/views/orders/create.html.erb | 0 app/views/orders/destroy.html.erb | 0 app/views/orders/edit.html.erb | 0 app/views/orders/index.html.erb | 0 app/views/orders/new.html.erb | 0 app/views/orders/show.html.erb | 0 app/views/orders/update.html.erb | 0 9 files changed, 53 insertions(+) create mode 100644 app/views/orders/_form.html.erb create mode 100644 app/views/orders/create.html.erb create mode 100644 app/views/orders/destroy.html.erb create mode 100644 app/views/orders/edit.html.erb create mode 100644 app/views/orders/index.html.erb create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb create mode 100644 app/views/orders/update.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8a0e3659ae..69f5730d21 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,2 +1,55 @@ class OrdersController < ApplicationController +#UNFINISHED + def index + @orders = Order.all + end + + def show + end + + def new + @order = Order.new + end + + def create + #set session[:order_id] == order.id + @order = Order.new order_params + + if @order.save + session[:order_id] = order.id + flash[:success] = "Order added successfully" + redirect_to root_path + else + flash[:error] = "Order couldn't be processed." + render :new + end + end + + def edit + @order = Order.find_by(id: params[:id]) + + unless @order + redirect_to root_path + end + end + + def update + @order = Order.find_by(id: params[:id]) + redirect_to orders_path unless @order + + if @order.update_attributes order_params + redirect_to root_path + else + render :edit + end + end + + def destroy + end + + private + def order_params + return params.require(:order).permit(:status, :email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) + end + end diff --git a/app/views/orders/_form.html.erb b/app/views/orders/_form.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/create.html.erb b/app/views/orders/create.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/destroy.html.erb b/app/views/orders/destroy.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/update.html.erb b/app/views/orders/update.html.erb new file mode 100644 index 0000000000..e69de29bb2 From bd10b5115deb3c5b70355b25062aa8e151c2b19a Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Tue, 17 Oct 2017 21:35:54 -0700 Subject: [PATCH 011/210] added seeds data folder and merchants.csv to folder --- merchant_seeds.csv => db/seed_data/merchants.csv | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename merchant_seeds.csv => db/seed_data/merchants.csv (100%) diff --git a/merchant_seeds.csv b/db/seed_data/merchants.csv similarity index 100% rename from merchant_seeds.csv rename to db/seed_data/merchants.csv From d5f3ebadef113af523fade24cbbe755c7b2840b3 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Tue, 17 Oct 2017 21:49:10 -0700 Subject: [PATCH 012/210] updated seeds.rb file --- db/seeds.rb | 59 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..d0b686ddf8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,52 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) +require 'csv' + +MERCHANT_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') +puts "Loading raw merchant data from #{MERCHANT_FILE}" + +merchant_failures = [] +CSV.foreach(MERCHANT_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.username = row['username'] + merchant.email = row['email'] + puts "Created merchant: #{merchant.inspect}" + successful = merchant.save + if !successful + merchant_failures << merchant + end +end + +puts "Added #{Merchant.count} merchant records" +puts "#{merchant_failures.length} merchants failed to save" + + + +PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +puts "Loading raw product data from #{PRODUCT_FILE}" + +product_failures = [] +CSV.foreach(PRODUCT_FILE, :headers => true) do |row| + product = Product.new + product.name = row['name'] + product.price = row['price'] + product.quantity_avail = row['quantity_avail'] + puts "Created product: #{product.inspect}" + successful = product.save + if !successful + product_failures << product + end +end + +puts "Added #{Product.count} product records" +puts "#{product_failures.length} products failed to save" + + +# Since we set the primary key (the ID) manually on each of the +# tables, we've got to tell postgres to reload the latest ID +# values. Otherwise when we create a new record it will try +# to start at ID 1, which will be a conflict. +puts "Manually resetting PK sequence on each table" +ActiveRecord::Base.connection.tables.each do |t| + ActiveRecord::Base.connection.reset_pk_sequence!(t) +end + +puts "done" From 3a595ab9c7ceb3a9d194eaec8583e5f8842d5fe5 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Tue, 17 Oct 2017 21:55:12 -0700 Subject: [PATCH 013/210] seeded db with merchants --- db/seeds.rb | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index d0b686ddf8..59aee3c047 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -20,24 +20,24 @@ -PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') -puts "Loading raw product data from #{PRODUCT_FILE}" - -product_failures = [] -CSV.foreach(PRODUCT_FILE, :headers => true) do |row| - product = Product.new - product.name = row['name'] - product.price = row['price'] - product.quantity_avail = row['quantity_avail'] - puts "Created product: #{product.inspect}" - successful = product.save - if !successful - product_failures << product - end -end - -puts "Added #{Product.count} product records" -puts "#{product_failures.length} products failed to save" +# PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +# puts "Loading raw product data from #{PRODUCT_FILE}" +# +# product_failures = [] +# CSV.foreach(PRODUCT_FILE, :headers => true) do |row| +# product = Product.new +# product.name = row['name'] +# product.price = row['price'] +# product.quantity_avail = row['quantity_avail'] +# puts "Created product: #{product.inspect}" +# successful = product.save +# if !successful +# product_failures << product +# end +# end +# +# puts "Added #{Product.count} product records" +# puts "#{product_failures.length} products failed to save" # Since we set the primary key (the ID) manually on each of the From f824e61581271bba3b7202e0126a740d19368509 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 12:40:34 -0700 Subject: [PATCH 014/210] Smoke effects & header basic styling. --- app/assets/javascripts/application.js | 2 + app/assets/javascripts/home.js | 175 +++++++++++++++++++++++++ app/assets/stylesheets/application.css | 31 +++++ app/views/categories/index.html.erb | 0 app/views/layouts/application.html.erb | 15 +++ app/views/products/index.html.erb | 0 app/views/products/root.html.erb | 19 +++ app/views/products/show.html.erb | 0 config/initializers/assets.rb | 1 + 9 files changed, 243 insertions(+) create mode 100644 app/assets/javascripts/home.js create mode 100644 app/views/categories/index.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/show.html.erb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4f2cc0f55a..eb67538ad7 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -13,6 +13,8 @@ //= require rails-ujs //= require foundation //= require turbolinks +//= require home + //= require_tree . $(function(){ $(document).foundation(); }); diff --git a/app/assets/javascripts/home.js b/app/assets/javascripts/home.js new file mode 100644 index 0000000000..ad985901cf --- /dev/null +++ b/app/assets/javascripts/home.js @@ -0,0 +1,175 @@ +// Create an array to store our particles +var particles = []; + +// The amount of particles to render +var particleCount = 30; + +// The maximum velocity in each direction +var maxVelocity = 2; + +// The target frames per second (how often do we want to update / redraw the scene) +var targetFPS = 33; + +// Set the dimensions of the canvas as variables so they can be used. +var canvasWidth = 400; +var canvasHeight = 400; + +// Create an image object (only need one instance) +var imageObj = new Image(); + +// Once the image has been downloaded then set the image on all of the particles +imageObj.onload = function() { + particles.forEach(function(particle) { + particle.setImage(imageObj); + }); +}; + +// Once the callback is arranged then set the source of the image +imageObj.src = "http://www.blog.jonnycornwell.com/wp-content/uploads/2012/07/Smoke10.png"; + +// A function to create a particle object. +function Particle(context) { + + // Set the initial x and y positions + this.x = 0; + this.y = 0; + + // Set the initial velocity + this.xVelocity = 0; + this.yVelocity = 0; + + // Set the radius + this.radius = 5; + + // Store the context which will be used to draw the particle + this.context = context; + + // The function to draw the particle on the canvas. + this.draw = function() { + + // If an image is set draw it + if(this.image){ + this.context.drawImage(this.image, this.x-128, this.y-128); + // If the image is being rendered do not draw the circle so break out of the draw function + return; + } + // Draw the circle as before, with the addition of using the position and the radius from this object. + this.context.beginPath(); + this.context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI, false); + this.context.fillStyle = "rgba(0, 255, 255, 1)"; + this.context.fill(); + this.context.closePath(); + }; + + // Update the particle. + this.update = function() { + // Update the position of the particle with the addition of the velocity. + this.x += this.xVelocity; + this.y += this.yVelocity; + + // Check if has crossed the right edge + if (this.x >= canvasWidth) { + this.xVelocity = -this.xVelocity; + this.x = canvasWidth; + } + // Check if has crossed the left edge + else if (this.x <= 0) { + this.xVelocity = -this.xVelocity; + this.x = 0; + } + + // Check if has crossed the bottom edge + if (this.y >= canvasHeight) { + this.yVelocity = -this.yVelocity; + this.y = canvasHeight; + } + + // Check if has crossed the top edge + else if (this.y <= 0) { + this.yVelocity = -this.yVelocity; + this.y = 0; + } + }; + + // A function to set the position of the particle. + this.setPosition = function(x, y) { + this.x = x; + this.y = y; + }; + + // Function to set the velocity. + this.setVelocity = function(x, y) { + this.xVelocity = x; + this.yVelocity = y; + }; + + this.setImage = function(image){ + this.image = image; + } +} + +// A function to generate a random number between 2 values +function generateRandom(min, max){ + return Math.random() * (max - min) + min; +} + +// The canvas context if it is defined. +var context; + +// Initialise the scene and set the context if possible +function init() { + var canvas = document.getElementById('myCanvas'); + if (canvas.getContext) { + + // Set the context variable so it can be re-used + context = canvas.getContext('2d'); + + // Create the particles and set their initial positions and velocities + for(var i=0; i < particleCount; ++i){ + var particle = new Particle(context); + + // Set the position to be inside the canvas bounds + particle.setPosition(generateRandom(0, canvasWidth), generateRandom(0, canvasHeight)); + + // Set the initial velocity to be either random and either negative or positive + particle.setVelocity(generateRandom(-maxVelocity, maxVelocity), generateRandom(-maxVelocity, maxVelocity)); + particles.push(particle); + } + } + else { + alert("Please use a modern browser"); + } +} + +// The function to draw the scene +function draw() { + // Clear the drawing surface and fill it with a black background + context.fillStyle = "rgba(0, 0, 0, 0.5)"; + context.fillRect(0, 0, 400, 400); + + // Go through all of the particles and draw them. + particles.forEach(function(particle) { + particle.draw(); + }); +} + +// Update the scene +function update() { + particles.forEach(function(particle) { + particle.update(); + }); +} + +// Initialize the scene +init(); + +// If the context is set then we can draw the scene (if not then the browser does not support canvas) +if (context) { + setInterval(function() { + // Update the scene befoe drawing + update(); + + // Draw the scene + draw(); + }, 1000 / targetFPS); +} diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a152282fce..dff2ae56e2 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -15,3 +15,34 @@ *= require foundation_and_overrides */ + + #myCanvas{ + background-color: black; + color: white; + } + +body { + width: 100%; +} + +.logo { + font-family: 'Meddon', cursive; + font-weight: bold; + font-size: 4rem; + float: left; + +} + +.nav-links { + font-size: 2rem; + float: right; +} + +.nav-links a { + padding: .5rem; +} + +.header { + margin: 1rem 0rem 1rem 0rem; + width: 100%; +} diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index cd60004891..2ff58552e7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,10 +9,25 @@ <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> + + +
+
+ + + + <%= link_to "Browse Products", products_path %> + <%= link_to "Browse Categories", categories_path %> + <%= link_to "Home", root_path %> + + +
+
+ <%= yield %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index e69de29bb2..7c5bf56bfc 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 4b828e80cb..7589aaf38e 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -12,3 +12,4 @@ # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. # Rails.application.config.assets.precompile += %w( admin.js admin.css ) +Rails.application.config.assets.precompile += %w( home.js ) From 3652f4a1d2b14dc05ab0023bf9e56349f45327fc Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 13:02:23 -0700 Subject: [PATCH 015/210] seed db setup and working in rails console --- app/models/product.rb | 2 +- ...0171018182552_remove_merchant_id_column.rb | 5 +++ .../20171018195147_add_merchant_column.rb | 5 +++ db/schema.rb | 5 ++- db/seed_data/products.csv | 11 ++++++ db/seeds.rb | 37 ++++++++++--------- products.csv | 11 ------ 7 files changed, 44 insertions(+), 32 deletions(-) create mode 100644 db/migrate/20171018182552_remove_merchant_id_column.rb create mode 100644 db/migrate/20171018195147_add_merchant_column.rb create mode 100644 db/seed_data/products.csv delete mode 100644 products.csv diff --git a/app/models/product.rb b/app/models/product.rb index 953470b0d0..660d8d8e25 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,5 @@ class Product < ApplicationRecord - belongs_to :user + belongs_to :merchant has_many :reviews has_and_belongs_to_many :categories has_and_belongs_to_many :orders diff --git a/db/migrate/20171018182552_remove_merchant_id_column.rb b/db/migrate/20171018182552_remove_merchant_id_column.rb new file mode 100644 index 0000000000..fabe132e08 --- /dev/null +++ b/db/migrate/20171018182552_remove_merchant_id_column.rb @@ -0,0 +1,5 @@ +class RemoveMerchantIdColumn < ActiveRecord::Migration[5.1] + def change + remove_column :products, :merchant_id + end +end diff --git a/db/migrate/20171018195147_add_merchant_column.rb b/db/migrate/20171018195147_add_merchant_column.rb new file mode 100644 index 0000000000..6a7f567358 --- /dev/null +++ b/db/migrate/20171018195147_add_merchant_column.rb @@ -0,0 +1,5 @@ +class AddMerchantColumn < ActiveRecord::Migration[5.1] + def change + add_reference :products, :merchant, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index ee07037392..fb689f4ca8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017211619) do +ActiveRecord::Schema.define(version: 20171018195147) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -52,9 +52,9 @@ t.string "name" t.decimal "price" t.integer "quantity_avail" - t.bigint "merchant_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "merchant_id" t.index ["merchant_id"], name: "index_products_on_merchant_id" end @@ -74,4 +74,5 @@ t.index ["product_id"], name: "index_reviews_on_product_id" end + add_foreign_key "products", "merchants" end diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv new file mode 100644 index 0000000000..f6d80a8f43 --- /dev/null +++ b/db/seed_data/products.csv @@ -0,0 +1,11 @@ +merchant_id,name,price,quantity_avail +1,toad stools,9.99,3 +2,witches brew,2.99,10 +3,wart cream,5.99,2 +4,gold cauldron,2.99,5 +5,The Book of Incredible Curses,17.99,12 +6,How to Prepare Frog Legs for All,18.99,3 +7,silk robe,35.99,6 +8,disappearing flask,10.99,4 +9,cough resistant spooky smog,23.99,8 +10,Spells to Cast for Good or Evil,16.99,5 diff --git a/db/seeds.rb b/db/seeds.rb index 59aee3c047..9c2c7a5576 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -20,24 +20,25 @@ -# PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') -# puts "Loading raw product data from #{PRODUCT_FILE}" -# -# product_failures = [] -# CSV.foreach(PRODUCT_FILE, :headers => true) do |row| -# product = Product.new -# product.name = row['name'] -# product.price = row['price'] -# product.quantity_avail = row['quantity_avail'] -# puts "Created product: #{product.inspect}" -# successful = product.save -# if !successful -# product_failures << product -# end -# end -# -# puts "Added #{Product.count} product records" -# puts "#{product_failures.length} products failed to save" +PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +puts "Loading raw product data from #{PRODUCT_FILE}" + +product_failures = [] +CSV.foreach(PRODUCT_FILE, :headers => true) do |row| + product = Product.new + product.merchant_id = row['merchant_id'] + product.name = row['name'] + product.price = row['price'] + product.quantity_avail = row['quantity_avail'] + puts "Created product: #{product.inspect}" + successful = product.save + if !successful + product_failures << product + end +end + +puts "Added #{Product.count} product records" +puts "#{product_failures.length} products failed to save" # Since we set the primary key (the ID) manually on each of the diff --git a/products.csv b/products.csv deleted file mode 100644 index 4ad2bf6bfb..0000000000 --- a/products.csv +++ /dev/null @@ -1,11 +0,0 @@ -name,price,quantity_avail -toad stools,9.99,3 -witches brew,2.99,10 -wart cream,5.99,2 -gold cauldron,2.99,5 -The Book of Incredible Curses,17.99,12 -How to Prepare Frog Legs for All,18.99,3 -silk robe,35.99,6 -disappearing flask,10.99,4 -cough resistant spooky smog,23.99,8 -Spells to Cast for Good or Evil,16.99,5 \ No newline at end of file From 65e433a6cb1838a18f67d1671243a48cf97811e4 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:03:27 -0700 Subject: [PATCH 016/210] Some sort of okay tests. --- app/models/product.rb | 4 ++++ test/fixtures/merchants.yml | 8 +++----- test/fixtures/products.yml | 14 +++++++++----- test/fixtures/products_categories.yml | 11 ----------- test/models/product_test.rb | 16 +++++++++++++--- test/models/products_category_test.rb | 9 --------- test/test_helper.rb | 3 ++- 7 files changed, 31 insertions(+), 34 deletions(-) delete mode 100644 test/fixtures/products_categories.yml delete mode 100644 test/models/products_category_test.rb diff --git a/app/models/product.rb b/app/models/product.rb index 660d8d8e25..93c0db5bbd 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,4 +1,8 @@ class Product < ApplicationRecord + validates :name, presence: true + validates :price, presence: true + validates :quantity_avail, presence: true + belongs_to :merchant has_many :reviews has_and_belongs_to_many :categories diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index dc3ee79b5d..d448026a22 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -4,8 +4,6 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +test: + username: "I'm a merchant" + email: "merchant@merchants.com" diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index dc3ee79b5d..eff94e2ee1 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +pointy_hat: + name: "Pointy Hat" + price: 9.99 + quantity_avail: 5 + +missing_name: + name: + price: 9.99 + quantity_avail: 5 diff --git a/test/fixtures/products_categories.yml b/test/fixtures/products_categories.yml deleted file mode 100644 index dc3ee79b5d..0000000000 --- a/test/fixtures/products_categories.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -# This model initially had no columns defined. If you add columns to the -# model remove the "{}" from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a618b0a156..8b2735cd1e 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,9 +1,19 @@ require "test_helper" describe Product do - let(:product) { Product.new } + describe "validations" do + it "requires a name" do + products(:pointy_hat).merchant = Merchant.first + products(:pointy_hat).save + products(:pointy_hat).valid?.must_equal true + + + products(:missing_name).valid?.must_equal false + + products(:missing_name).name = "Another pointy hat" + products(:missing_name).save + products(:missing_name).valid?.must_equal true + end - it "must be valid" do - value(product).must_be :valid? end end diff --git a/test/models/products_category_test.rb b/test/models/products_category_test.rb deleted file mode 100644 index f2c72224e4..0000000000 --- a/test/models/products_category_test.rb +++ /dev/null @@ -1,9 +0,0 @@ -require "test_helper" - -describe ProductsCategory do - let(:products_category) { ProductsCategory.new } - - it "must be valid" do - value(products_category).must_be :valid? - end -end diff --git a/test/test_helper.rb b/test/test_helper.rb index f8e01da98e..ecb3b34e99 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( From 3d1edb29ec8df1dd3cf7cb6ec9032c9b60f08876 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 14:04:30 -0700 Subject: [PATCH 017/210] must have name model test passing --- app/models/merchant.rb | 2 ++ test/fixtures/merchants.yml | 20 ++++++++++---------- test/fixtures/products_categories.yml | 11 ----------- test/models/category_test.rb | 4 ---- test/models/merchant_test.rb | 11 ++++++++--- test/models/order_test.rb | 5 ----- test/models/product_test.rb | 4 ---- test/models/products_category_test.rb | 9 --------- test/models/review_test.rb | 4 ---- test/test_helper.rb | 3 ++- 10 files changed, 22 insertions(+), 51 deletions(-) delete mode 100644 test/fixtures/products_categories.yml delete mode 100644 test/models/products_category_test.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 07aacc445d..5c2a3e38f3 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,3 +1,5 @@ class Merchant < ApplicationRecord has_many :products + + validates :username, presence: true end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index dc3ee79b5d..608cb8e95e 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -1,11 +1,11 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +spooky: + username: Spooky Books + email: mailing@email.com -# This model initially had no columns defined. If you add columns to the -# model remove the "{}" from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value +ghosty: + username: Ghost Artifacts + email: letters@webmail.com + +toady: + username: Toads Are We + email: toadsareanimalstoo@mail.com diff --git a/test/fixtures/products_categories.yml b/test/fixtures/products_categories.yml deleted file mode 100644 index dc3ee79b5d..0000000000 --- a/test/fixtures/products_categories.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -# This model initially had no columns defined. If you add columns to the -# model remove the "{}" from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 781320ad8e..58b55963d7 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,9 +1,5 @@ require "test_helper" describe Category do - let(:category) { Category.new } - it "must be valid" do - value(category).must_be :valid? - end end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1cc99d985f..80025bdae4 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,9 +1,14 @@ require "test_helper" describe Merchant do - let(:merchant) { Merchant.new } + # let(:merchant) {Merchant.new} + # let(:spooky) {merchants(:spooky)} #gets books from the fixtures with this shorthand name for yml + # let(:ghosty) {merchants(:ghosty)} + + it "must have a merchant name to be vaild" do + merchant = Merchant.new(username: 'Spooky Books') + merchant.valid?.must_equal true - it "must be valid" do - value(merchant).must_be :valid? end + end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index df80f10fb6..d2e887e3bd 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,9 +1,4 @@ require "test_helper" describe Order do - let(:order) { Order.new } - - it "must be valid" do - value(order).must_be :valid? - end end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a618b0a156..f6923dec05 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,9 +1,5 @@ require "test_helper" describe Product do - let(:product) { Product.new } - it "must be valid" do - value(product).must_be :valid? - end end diff --git a/test/models/products_category_test.rb b/test/models/products_category_test.rb deleted file mode 100644 index f2c72224e4..0000000000 --- a/test/models/products_category_test.rb +++ /dev/null @@ -1,9 +0,0 @@ -require "test_helper" - -describe ProductsCategory do - let(:products_category) { ProductsCategory.new } - - it "must be valid" do - value(products_category).must_be :valid? - end -end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..38a177762c 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,9 +1,5 @@ require "test_helper" describe Review do - let(:review) { Review.new } - it "must be valid" do - value(review).must_be :valid? - end end diff --git a/test/test_helper.rb b/test/test_helper.rb index f8e01da98e..ecb3b34e99 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( From dbb03de404ea65844b8c48bc37e8cfcb58376ee4 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 14:08:29 -0700 Subject: [PATCH 018/210] must have merchant email model test passing --- app/models/merchant.rb | 1 + test/models/merchant_test.rb | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 5c2a3e38f3..1f5ef140ac 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -2,4 +2,5 @@ class Merchant < ApplicationRecord has_many :products validates :username, presence: true + validates :email, presence: true end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 80025bdae4..7a7c98eff3 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,14 +1,20 @@ require "test_helper" describe Merchant do - # let(:merchant) {Merchant.new} - # let(:spooky) {merchants(:spooky)} #gets books from the fixtures with this shorthand name for yml - # let(:ghosty) {merchants(:ghosty)} + let(:merchant) {Merchant.new} + let(:spooky) {merchants(:spooky)} + let(:ghosty) {merchants(:ghosty)} it "must have a merchant name to be vaild" do - merchant = Merchant.new(username: 'Spooky Books') - merchant.valid?.must_equal true + spooky.valid?.must_equal true + spooky.username = nil + spooky.valid?.must_equal false + end + it "must have a merchant email to be vaild" do + spooky.valid?.must_equal true + spooky.email = nil + spooky.valid?.must_equal false end end From 2486d7acaa2b6190ae52e5b1fcf6f51bea734d01 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Wed, 18 Oct 2017 14:11:14 -0700 Subject: [PATCH 019/210] Test order responds to .products --- test/fixtures/merchants.yml | 6 +++--- test/fixtures/orders.yml | 14 +++++++++----- test/fixtures/products.yml | 2 +- test/models/category_test.rb | 14 +++++++------- test/models/merchant_test.rb | 14 +++++++------- test/models/order_test.rb | 12 ++++++++---- test/models/product_test.rb | 34 +++++++++++++++++----------------- test/models/review_test.rb | 14 +++++++------- 8 files changed, 59 insertions(+), 51 deletions(-) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index d448026a22..2931b7a43d 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -4,6 +4,6 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -test: - username: "I'm a merchant" - email: "merchant@merchants.com" +witch: + username: witch + email: witch@merchants.com diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index dc3ee79b5d..a703228cc2 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +new: + status: pending + email: nil + address: nil + name: nil + card_number: nil + card_exp: nil + card_cvv: nil + zip_code: nil diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index eff94e2ee1..8112686ab5 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -8,7 +8,7 @@ pointy_hat: name: "Pointy Hat" price: 9.99 quantity_avail: 5 - + missing_name: name: price: 9.99 diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 781320ad8e..98950968b7 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,9 +1,9 @@ require "test_helper" -describe Category do - let(:category) { Category.new } - - it "must be valid" do - value(category).must_be :valid? - end -end +# describe Category do +# let(:category) { Category.new } +# +# it "must be valid" do +# value(category).must_be :valid? +# end +# end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1cc99d985f..ff5d77d7f6 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,9 +1,9 @@ require "test_helper" -describe Merchant do - let(:merchant) { Merchant.new } - - it "must be valid" do - value(merchant).must_be :valid? - end -end +# describe Merchant do +# let(:merchant) { Merchant.new } +# +# it "must be valid" do +# value(merchant).must_be :valid? +# end +# end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index df80f10fb6..887ecaaeae 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,9 +1,13 @@ require "test_helper" describe Order do - let(:order) { Order.new } - - it "must be valid" do - value(order).must_be :valid? + describe "relations" do + it "has a list of products" do + new = orders(:new) + new.must_respond_to :products + new.products.each do |product| + product.must_be_kind_of Product + end + end end end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 8b2735cd1e..92395e39a8 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,19 +1,19 @@ require "test_helper" -describe Product do - describe "validations" do - it "requires a name" do - products(:pointy_hat).merchant = Merchant.first - products(:pointy_hat).save - products(:pointy_hat).valid?.must_equal true - - - products(:missing_name).valid?.must_equal false - - products(:missing_name).name = "Another pointy hat" - products(:missing_name).save - products(:missing_name).valid?.must_equal true - end - - end -end +# describe Product do +# describe "validations" do +# it "requires a name" do +# products(:pointy_hat).merchant = Merchant.first +# products(:pointy_hat).save +# products(:pointy_hat).valid?.must_equal true +# +# +# products(:missing_name).valid?.must_equal false +# +# products(:missing_name).name = "Another pointy hat" +# products(:missing_name).save +# products(:missing_name).valid?.must_equal true +# end +# +# end +# end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..984ab5a38c 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,9 +1,9 @@ require "test_helper" -describe Review do - let(:review) { Review.new } - - it "must be valid" do - value(review).must_be :valid? - end -end +# describe Review do +# let(:review) { Review.new } +# +# it "must be valid" do +# value(review).must_be :valid? +# end +# end From 47e7e022d7366f289676063135842a659a5c68a7 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:12:23 -0700 Subject: [PATCH 020/210] Passing product model validation tests! --- test/fixtures/products.yml | 2 +- test/models/product_test.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index eff94e2ee1..8112686ab5 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -8,7 +8,7 @@ pointy_hat: name: "Pointy Hat" price: 9.99 quantity_avail: 5 - + missing_name: name: price: 9.99 diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 8b2735cd1e..b20f6e6da5 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -8,6 +8,8 @@ products(:pointy_hat).valid?.must_equal true + products(:missing_name).merchant = Merchant.first + products(:missing_name).save products(:missing_name).valid?.must_equal false products(:missing_name).name = "Another pointy hat" @@ -15,5 +17,29 @@ products(:missing_name).valid?.must_equal true end + it "requires a price" do + test = Product.new(name: "Caldroun", quantity_avail: 1, merchant: Merchant.first) + test.valid?.must_equal false + + test.price = 59.99 + test.valid?.must_equal true + end + + it "requires a quantity_avail" do + test = Product.new(name: "Caldroun", price: 68.50, merchant: Merchant.first) + test.valid?.must_equal false + + test.quantity_avail = 1 + test.valid?.must_equal true + end + + it "requires a quantity_avail" do + test = Product.new(name: "Caldroun", price: 68.50, merchant: Merchant.first) + test.valid?.must_equal false + + test.quantity_avail = 1 + test.valid?.must_equal true + end + end end From ebbad829ecb7748624283694df1f5e118ebf44d7 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:21:01 -0700 Subject: [PATCH 021/210] More product model tests and validity for product fields for numercality, greater than 0. --- app/models/product.rb | 4 ++-- test/models/product_test.rb | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 93c0db5bbd..2787b1eb9e 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,7 +1,7 @@ class Product < ApplicationRecord validates :name, presence: true - validates :price, presence: true - validates :quantity_avail, presence: true + validates :price, presence: true, numericality: { greater_than: 0 } + validates :quantity_avail, presence: true, numericality: { greater_than_or_equal_to: 0 } belongs_to :merchant has_many :reviews diff --git a/test/models/product_test.rb b/test/models/product_test.rb index b20f6e6da5..1d27331681 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -17,6 +17,10 @@ products(:missing_name).valid?.must_equal true end + it "needs a name that is a string" do + + end + it "requires a price" do test = Product.new(name: "Caldroun", quantity_avail: 1, merchant: Merchant.first) test.valid?.must_equal false @@ -25,12 +29,17 @@ test.valid?.must_equal true end - it "requires a quantity_avail" do - test = Product.new(name: "Caldroun", price: 68.50, merchant: Merchant.first) + it "requires a price that is a number" do + test = Product.new(name: "Caldroun", quantity_avail: 1, price: "cats", merchant: Merchant.first) test.valid?.must_equal false + end - test.quantity_avail = 1 - test.valid?.must_equal true + it "requires a price that is greater than 0" do + test = Product.new(name: "Caldroun", quantity_avail: 1, price: -2.50, merchant: Merchant.first) + test.valid?.must_equal false + + another = Product.new(name: "Caldroun", quantity_avail: 1, price: 0, merchant: Merchant.first) + another.valid?.must_equal false end it "requires a quantity_avail" do @@ -41,5 +50,15 @@ test.valid?.must_equal true end + it "can have a quantity_avail of 0" do + test = Product.new(name: "Caldroun", quantity_avail: 0, price: 68.50, merchant: Merchant.first) + test.valid?.must_equal true + end + + it "cannot have a quantity_avail less than 0" do + test = Product.new(name: "Caldroun", quantity_avail: -1, price: 68.50, merchant: Merchant.first) + test.valid?.must_equal false + end + end end From 7a831ba317405d5e03624ed5a9bd71941648431b Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 14:27:11 -0700 Subject: [PATCH 022/210] model tests passing for unique username and email --- app/models/merchant.rb | 4 ++-- test/models/merchant_test.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 1f5ef140ac..dc586c6027 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,6 +1,6 @@ class Merchant < ApplicationRecord has_many :products - validates :username, presence: true - validates :email, presence: true + validates :username, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 7a7c98eff3..4ffda68df9 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -17,4 +17,32 @@ spooky.valid?.must_equal false end + it "requires a unique merchant username" do + username = "Ghouls Are Us" + email1 = "ghosts@gmail.com" + email2 = "sweepsthebroom@gmail.com" + merchant1 = Merchant.new(username: username, email: email1) + merchant1.save! + + merchant2 = Merchant.new(username: username, email: email2) + result = merchant2.save + result.must_equal false + merchant2.errors.messages.must_include :username + end + + it "requires a unique merchant email" do + username1 = "Ghouls Are Us" + username2 = "Spooky Woods" + email = "ghosts@gmail.com" + merchant1 = Merchant.new(username: username1, email: email) + merchant1.save! + + merchant2 = Merchant.new(username: username2, email: email) + result = merchant2.save + result.must_equal false + merchant2.errors.messages.must_include :email + end + + + end From 3f4fd4d742b658965db7e14655d5c2ec436d641b Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Wed, 18 Oct 2017 14:27:13 -0700 Subject: [PATCH 023/210] Test order must have status to be valid --- app/models/order.rb | 1 + test/fixtures/orders.yml | 2 +- test/models/order_test.rb | 23 ++++++++++++++++++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 6ca855ee53..e505400c59 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,3 +1,4 @@ class Order < ApplicationRecord has_and_belongs_to_many :products + validates :status, presence: true end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index a703228cc2..3780e80b9a 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,7 +4,7 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -new: +pending_order: status: pending email: nil address: nil diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 887ecaaeae..6346ebbd6c 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -3,11 +3,28 @@ describe Order do describe "relations" do it "has a list of products" do - new = orders(:new) - new.must_respond_to :products - new.products.each do |product| + pending_order = orders(:pending_order) + pending_order.must_respond_to :products + pending_order.products.each do |product| product.must_be_kind_of Product end end + it "has a list of merchants through products" do + pending_order = orders(:pending_order) + pending_order.must_respond_to :products + pending_order.products.each do |product| + product.merchant.must_be_kind_of Merchant + end + end + end + describe "validations" do + it "must have a status to be valid" do + order_with_stat = orders(:pending_order) + order_with_stat.valid?.must_equal true + + no_stat_order = orders(:pending_order) + no_stat_order.status = nil + no_stat_order.valid?.must_equal false + end end end From f3d7c04a6888cbc08f2d1e1737c3af1e7d11ecc8 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:29:25 -0700 Subject: [PATCH 024/210] Passing tests for relations between products and merchants/reviews. --- test/models/product_test.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 1d27331681..f5bfbc3acd 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -59,6 +59,22 @@ test = Product.new(name: "Caldroun", quantity_avail: -1, price: 68.50, merchant: Merchant.first) test.valid?.must_equal false end + end + + describe "relations" do + it "has a merchant" do + test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) + test.merchant.must_equal Merchant.first + + test.merchant.id.must_equal Merchant.first.id + end + + it "has reviews" do + test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) + review = Review.create(rating: 5, text_review: "This was better than my cast iron pan!", product_id: test.id) + test.reviews.must_include review + test.reviews[0].must_be_kind_of Review + end end end From 1d3fb567c61f00a5476023adda1201ce5f505e0c Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:41:18 -0700 Subject: [PATCH 025/210] Passing tests for review validations. --- app/models/review.rb | 1 + test/models/review_test.rb | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index b2ca4935ed..a9924876b5 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,2 +1,3 @@ class Review < ApplicationRecord + validates :rating, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 5} end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..839443ba09 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,9 +1,32 @@ require "test_helper" describe Review do - let(:review) { Review.new } + describe "validations" do + it "requires a rating" do + test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) + review = Review.new(text_review: "This was better than my cast iron pan!", product_id: test.id) + review.valid?.must_equal false - it "must be valid" do - value(review).must_be :valid? - end + review.rating = 5 + review.valid?.must_equal true + end + + it "requires a rating to be an integer" do + test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) + review = Review.new(rating: "cats", text_review: "This was better than my cast iron pan!", product_id: test.id) + review.valid?.must_equal false + + review.rating = 5 + review.valid?.must_equal true + end + + it "requires a rating to be an integer betwene 1 and 5" do + test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) + review = Review.new(rating: 0, text_review: "This was better than my cast iron pan!", product_id: test.id) + review.valid?.must_equal false + + review.rating = 9 + review.valid?.must_equal false + end +end end From 4b2805c8b240d7b88d8f0b498e9bdfc025893feb Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 14:45:30 -0700 Subject: [PATCH 026/210] category model tests passing for unqiueness and presence --- app/models/category.rb | 3 +++ test/fixtures/categories.yml | 14 ++++---------- test/models/category_test.rb | 24 ++++++++++++++++++++++++ test/models/merchant_test.rb | 7 ++----- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index f3218758f1..9019c677a5 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,3 +1,6 @@ class Category < ApplicationRecord has_and_belongs_to_many :products + + validates :name, presence: true, uniqueness: true + validates_length_of :name, :maximum => 25 end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index dc3ee79b5d..4cfe40bdac 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -1,11 +1,5 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +brooms: + name: custom broom handles -# This model initially had no columns defined. If you add columns to the -# model remove the "{}" from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value +cauldrons: + name: bronzed cauldrons diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 58b55963d7..799f4de430 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,5 +1,29 @@ require "test_helper" describe Category do + let(:category) {Category.new} + let(:brooms) {categories(:brooms)} + let(:cauldrons) {categories(:cauldrons)} + + it "must have a category name to be valid" do + brooms.valid?.must_equal true + brooms.name = nil + brooms.valid?.must_equal false + end + + it "requires a unique category name" do + category = "broom handles" + category1 = Category.new(name: category) + category1.save! + + category2 = Category.new(name: category) + result = category2.save + result.must_equal false + category2.errors.messages.must_include :name + end + + + + end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 4ffda68df9..bb92727eb1 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -5,13 +5,13 @@ let(:spooky) {merchants(:spooky)} let(:ghosty) {merchants(:ghosty)} - it "must have a merchant name to be vaild" do + it "must have a merchant name to be valid" do spooky.valid?.must_equal true spooky.username = nil spooky.valid?.must_equal false end - it "must have a merchant email to be vaild" do + it "must have a merchant email to be valid" do spooky.valid?.must_equal true spooky.email = nil spooky.valid?.must_equal false @@ -42,7 +42,4 @@ result.must_equal false merchant2.errors.messages.must_include :email end - - - end From ac95b4607d43d7c2616a9ec1f4aab0a3c4f5d7bd Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Wed, 18 Oct 2017 14:59:02 -0700 Subject: [PATCH 027/210] category model test passing for character length --- app/models/category.rb | 3 +-- test/models/category_test.rb | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/models/category.rb b/app/models/category.rb index 9019c677a5..f751369d1a 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,6 +1,5 @@ class Category < ApplicationRecord has_and_belongs_to_many :products - validates :name, presence: true, uniqueness: true - validates_length_of :name, :maximum => 25 + validates :name, presence: true, uniqueness: true, length: { maximum: 25 } end diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 799f4de430..241cb2440c 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -22,8 +22,8 @@ category2.errors.messages.must_include :name end - - - - + it "must not have a category name of more than 20 characters" do + category = Category.new(name: "various colored sheets for ghosts") + category.valid?.must_equal false + end end From 6bde75a5cfe2062bb24ad0ef6d2fa99a3fc242e4 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 14:59:03 -0700 Subject: [PATCH 028/210] Product controller actions & product index view. --- app/controllers/products_controller.rb | 38 ++++++++++++++++++++++++++ app/views/products/index.html.erb | 12 ++++++++ 2 files changed, 50 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index f1ad12ddea..97969f6efd 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,2 +1,40 @@ class ProductsController < ApplicationController + def index + @products = Product.all + end + + def new + @product = Product.new + end + + def create + @product = Product.new(name: params[:product][:name], price: params[:product][:price], quantity_avail: params[:product][:quantity_avail], merchant: params[:product][:merchant] ) + if @product.save + flash[:status] = :success + flash[:result_text] = "Successfully created your product!" + redirect_to product_path + else + flash[:status] = :failure + flash[:result_text] = "Could not create #{@category.name} category." + flash[:messages] = @product.errors.messages + render :new, status: :bad_request + end + end + + def show + @product = Product.find_by(id: params[:id]) + end + + def destroy + @product = Product.find_by(id: params[:id]) + if @product.destroy + flash[:status] = :success + flash[:result_text] = "Product deleted" + redirect_to categories_path + else + flash[:status] = :failure + flash[:result_text] = "That product is unable to be deleted." + end + end + end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index e69de29bb2..52864038b4 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -0,0 +1,12 @@ +
+ <% @products.each do |product| %> +
+
+

Product:

<%= product.name %> +

Price:

<%= product.price %> +

Quantity:

<%= product.quantity_avail %> +

Sold by:

<%= product.merchant.username %> +
+
+ <% end %> +
From aab87bb3e48b6c8e9d149f965540260cae6d4c40 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Wed, 18 Oct 2017 15:10:32 -0700 Subject: [PATCH 029/210] Validate order status --- app/models/order.rb | 3 ++- test/models/order_test.rb | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/order.rb b/app/models/order.rb index e505400c59..1a7a658ded 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,4 +1,5 @@ class Order < ApplicationRecord + VALID_STATS = ["pending", "complete"] has_and_belongs_to_many :products - validates :status, presence: true + validates :status, presence: true, inclusion: { in: VALID_STATS } end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 6346ebbd6c..12ea5bb792 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -26,5 +26,11 @@ no_stat_order.status = nil no_stat_order.valid?.must_equal false end + it "must have a status equal to pending or complete" do + order_with_bogus_stat = orders(:pending_order) + order_with_bogus_stat.status = "almost a status" + order_with_bogus_stat.valid?.must_equal false + end + end end From efc6495e24cc1513c296df159e4292ea3233321f Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Wed, 18 Oct 2017 15:17:48 -0700 Subject: [PATCH 030/210] Functioning but not pretty products index view. --- app/assets/stylesheets/application.css | 25 +++++++++++++++++++++++++ app/views/products/index.html.erb | 11 ++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index dff2ae56e2..aed07e97fa 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -46,3 +46,28 @@ body { margin: 1rem 0rem 1rem 0rem; width: 100%; } + +.all-products { + display: flex; + flex-flow: row; + flex-wrap: wrap; +} + +.info-card { + clear: both; + margin-left: -15px; + margin-right: -15px; + overflow: hidden; +} + +.product { + display: flex; + flex-flow: column; + padding: 1em; + text-align: left; + color: #0F5364; + font-family: 'Slabo 13px', serif; + width: 20rem; + background-color: grey; + margin: 1rem; +} diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 52864038b4..b25c270b06 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,11 +1,12 @@
+ <% @products.each do |product| %> -
+
-

Product:

<%= product.name %> -

Price:

<%= product.price %> -

Quantity:

<%= product.quantity_avail %> -

Sold by:

<%= product.merchant.username %> + Product: <%= product.name %> + Price: <%= product.price %> + Quantity: <%= product.quantity_avail %> + Sold By: <%= product.merchant.username %>
<% end %> From 50b55f1ac7b7e00e10a34de5a1b8fdf57e7d073a Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Wed, 18 Oct 2017 15:41:23 -0700 Subject: [PATCH 031/210] Finish order model testing for validations and relations --- app/models/order.rb | 12 +++++++++ test/fixtures/orders.yml | 10 +++++++ test/models/order_test.rb | 53 ++++++++++++++++++++++++++++++-------- test/models/review_test.rb | 3 --- 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 1a7a658ded..e02b256138 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,4 +2,16 @@ class Order < ApplicationRecord VALID_STATS = ["pending", "complete"] has_and_belongs_to_many :products validates :status, presence: true, inclusion: { in: VALID_STATS } + validates :email, presence: true, if: :completed? + validates :address, presence: true, if: :completed? + validates :name, presence: true, if: :completed? + validates :card_number, presence: true, if: :completed? + validates :card_exp, presence: true, if: :completed? + validates :card_cvv, presence: true, if: :completed? + validates :zip_code, presence: true, if: :completed? + + + def completed? + self.status == "complete" + end end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 3780e80b9a..7b89c7f8f1 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -13,3 +13,13 @@ pending_order: card_exp: nil card_cvv: nil zip_code: nil + +complete_order: + status: complete + email: buyer@email.com + address: 100 Witchy Way, Seattle, WA + name: Gale + card_number: 1234 1234 1234 1234 + card_exp: 01/21 + card_cvv: "546" + zip_code: "98122" diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 12ea5bb792..6d3b5e4be6 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -5,16 +5,6 @@ it "has a list of products" do pending_order = orders(:pending_order) pending_order.must_respond_to :products - pending_order.products.each do |product| - product.must_be_kind_of Product - end - end - it "has a list of merchants through products" do - pending_order = orders(:pending_order) - pending_order.must_respond_to :products - pending_order.products.each do |product| - product.merchant.must_be_kind_of Merchant - end end end describe "validations" do @@ -31,6 +21,47 @@ order_with_bogus_stat.status = "almost a status" order_with_bogus_stat.valid?.must_equal false end - + it "must have all user information if status is complete" do + complete_order = orders(:complete_order) + complete_order.valid?.must_equal true + + complete_order.email = nil + complete_order.valid?.must_equal false + complete_order.email = "present" + complete_order.valid?.must_equal true + + complete_order.address = nil + complete_order.valid?.must_equal false + complete_order.address = "present" + complete_order.valid?.must_equal true + + complete_order.name = nil + complete_order.valid?.must_equal false + complete_order.name = "present" + complete_order.valid?.must_equal true + + complete_order.card_number = nil + complete_order.valid?.must_equal false + complete_order.card_number = "present" + complete_order.valid?.must_equal true + + complete_order.card_exp = nil + complete_order.valid?.must_equal false + complete_order.card_exp = "present" + complete_order.valid?.must_equal true + + complete_order.card_cvv = nil + complete_order.valid?.must_equal false + complete_order.card_cvv = "present" + complete_order.valid?.must_equal true + + complete_order.zip_code = nil + complete_order.valid?.must_equal false + complete_order.zip_code = "present" + complete_order.valid?.must_equal true + + pending_order = orders(:pending_order) + pending_order.valid?.must_equal true + end end end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 9ac16ae9c3..1f6c703e13 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,8 +1,6 @@ require "test_helper" describe Review do -<<<<<<< HEAD -======= describe "validations" do it "requires a rating" do test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) @@ -31,5 +29,4 @@ review.valid?.must_equal false end end ->>>>>>> 6bde75a5cfe2062bb24ad0ef6d2fa99a3fc242e4 end From a4cbefe8eddee3258be0d4e5a18cc3a1b1c45d89 Mon Sep 17 00:00:00 2001 From: Sara C Date: Wed, 18 Oct 2017 15:42:10 -0700 Subject: [PATCH 032/210] deleted git text from review_test --- test/models/review_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 9ac16ae9c3..bc6828706b 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,8 +1,8 @@ require "test_helper" describe Review do -<<<<<<< HEAD -======= + + describe "validations" do it "requires a rating" do test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) @@ -31,5 +31,5 @@ review.valid?.must_equal false end end ->>>>>>> 6bde75a5cfe2062bb24ad0ef6d2fa99a3fc242e4 + end From 4db2d3fe806776ff8851c76aae69d8d8f1984c49 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Wed, 18 Oct 2017 18:00:08 -0700 Subject: [PATCH 033/210] Orders controller tests index and new actions --- app/controllers/orders_controller.rb | 15 +- test/controllers/orders_controller_test.rb | 220 ++++++++++++++++++++- 2 files changed, 228 insertions(+), 7 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 69f5730d21..88a6901b91 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -13,10 +13,11 @@ def new def create #set session[:order_id] == order.id - @order = Order.new order_params + @order = Order.new + @order.status = "pending" if @order.save - session[:order_id] = order.id + session[:order_id] = @order.id flash[:success] = "Order added successfully" redirect_to root_path else @@ -25,6 +26,10 @@ def create end end + def complete + + end + def edit @order = Order.find_by(id: params[:id]) @@ -48,8 +53,8 @@ def destroy end private - def order_params - return params.require(:order).permit(:status, :email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) - end + # def order_params + # return params.require(:order).permit(:status, :email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) + # end end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 68784595f3..64a14f21a3 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,7 +1,223 @@ require "test_helper" describe OrdersController do - # it "must be a real test" do - # flunk "Need real tests" + + CATEGORIES = %w(albums books movies) + INVALID_CATEGORIES = ["nope", "42", "", " ", "albumstrailingtext"] + + describe "index" do + it "succeeds when there are orders" do + Order.count.must_be :>, 0, "No works in the test fixtures" + get orders_path + must_respond_with :success + end + + it "succeeds when there are no orders" do + Order.destroy_all + get orders_path + must_respond_with :success + end + end + + describe "new" do + it "works" do + get new_order_path + must_respond_with :success + end + end + + describe "create" do + it "creates an order with a status of pending" do + #Arrange: nothing to arrange for the creation. Will always start with status of pending and all other values as nil + start_count = Order.count + #Act + post orders_path + #Assert + must_respond_with :redirect + Order.count.must_equal start_count + 1 + end + + # it "renders bad_request and does not update the DB for bogus data" do + # work_data = { + # work: { + # title: "" + # } + # } + # CATEGORIES.each do |category| + # work_data[:work][:category] = category + # + # start_count = Work.count + # + # post works_path(category), params: work_data + # must_respond_with :bad_request + # + # Work.count.must_equal start_count + # end + # end + # + # it "renders 400 bad_request for bogus categories" do + # work_data = { + # work: { + # title: "test work" + # } + # } + # INVALID_CATEGORIES.each do |category| + # work_data[:work][:category] = category + # + # start_count = Work.count + # + # post works_path(category), params: work_data + # must_respond_with :bad_request + # + # Work.count.must_equal start_count + # end + # end + # end + # + # describe "show" do + # it "succeeds for an extant work ID" do + # get work_path(Work.first) + # must_respond_with :success + # end + # + # it "renders 404 not_found for a bogus work ID" do + # bogus_work_id = Work.last.id + 1 + # get work_path(bogus_work_id) + # must_respond_with :not_found + # end + # end + # + # describe "edit" do + # it "succeeds for an extant work ID" do + # get edit_work_path(Work.first) + # must_respond_with :success + # end + # + # it "renders 404 not_found for a bogus work ID" do + # bogus_work_id = Work.last.id + 1 + # get edit_work_path(bogus_work_id) + # must_respond_with :not_found + # end + # end + # + # describe "update" do + # it "succeeds for valid data and an extant work ID" do + # work = Work.first + # work_data = { + # work: { + # title: work.title + " addition" + # } + # } + # + # patch work_path(work), params: work_data + # must_redirect_to work_path(work) + # + # # Verify the DB was really modified + # Work.find(work.id).title.must_equal work_data[:work][:title] + # end + # + # it "renders bad_request for bogus data" do + # work = Work.first + # work_data = { + # work: { + # title: "" + # } + # } + # + # patch work_path(work), params: work_data + # must_respond_with :not_found + # + # # Verify the DB was not modified + # Work.find(work.id).title.must_equal work.title + # end + # + # it "renders 404 not_found for a bogus work ID" do + # bogus_work_id = Work.last.id + 1 + # get work_path(bogus_work_id) + # must_respond_with :not_found + # end + # end + # + # describe "destroy" do + # it "succeeds for an extant work ID" do + # work_id = Work.first.id + # + # delete work_path(work_id) + # must_redirect_to root_path + # + # # The work should really be gone + # Work.find_by(id: work_id).must_be_nil + # end + # + # it "renders 404 not_found and does not update the DB for a bogus work ID" do + # start_count = Work.count + # + # bogus_work_id = Work.last.id + 1 + # delete work_path(bogus_work_id) + # must_respond_with :not_found + # + # Work.count.must_equal start_count + # end # end + # + # describe "upvote" do + # let(:user) { User.create!(username: "test_user") } + # let(:work) { Work.first } + # + # def login + # post login_path, params: { username: user.username } + # must_respond_with :redirect + # end + # + # def logout + # post logout_path + # must_respond_with :redirect + # end + # + # it "returns 401 unauthorized if no user is logged in" do + # start_vote_count = work.votes.count + # + # post upvote_path(work) + # must_respond_with :unauthorized + # + # work.votes.count.must_equal start_vote_count + # end + # + # it "returns 401 unauthorized after the user has logged out" do + # start_vote_count = work.votes.count + # + # login + # logout + # + # post upvote_path(work) + # must_respond_with :unauthorized + # + # work.votes.count.must_equal start_vote_count + # end + # + # it "succeeds for a logged-in user and a fresh user-vote pair" do + # start_vote_count = work.votes.count + # + # login + # + # post upvote_path(work) + # # Should be a redirect_back + # must_respond_with :redirect + # + # work.reload + # work.votes.count.must_equal start_vote_count + 1 + # end + # + # it "returns 409 conflict if the user has already voted for that work" do + # login + # Vote.create!(user: user, work: work) + # + # start_vote_count = work.votes.count + # + # post upvote_path(work) + # must_respond_with :conflict + # + # work.votes.count.must_equal start_vote_count + + end end From 25f1088f3fda172437195c05848c091462c10e53 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 08:04:32 -0700 Subject: [PATCH 034/210] Pass all works controller tests except update --- app/controllers/orders_controller.rb | 60 ++-- test/controllers/orders_controller_test.rb | 315 +++++++++------------ 2 files changed, 177 insertions(+), 198 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 88a6901b91..7949b5363a 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,18 +1,23 @@ class OrdersController < ApplicationController -#UNFINISHED +#TODO: clean up with controller filters +#TODO: discuss rules around destroy action. what happens to products/inventory when an order is destroyed? def index @orders = Order.all end def show + @order = Order.find_by(id: params[:id]) + unless @order + redirect_to root_path, status: :not_found + end end + #Do we actually need a new action? def new @order = Order.new end def create - #set session[:order_id] == order.id @order = Order.new @order.status = "pending" @@ -26,35 +31,56 @@ def create end end - def complete - - end - def edit @order = Order.find_by(id: params[:id]) - unless @order - redirect_to root_path + if !@order + redirect_to root_path, status: :not_found + elsif @order + if @order.status == "complete" + flash[:error] = "You cannot edit a complete order" + redirect_to root_path + end end end def update @order = Order.find_by(id: params[:id]) - redirect_to orders_path unless @order - - if @order.update_attributes order_params - redirect_to root_path - else - render :edit + if !@order + redirect_to root_path, status: :not_found + elsif @order + if @order.status == "complete" + flash[:error] = "You cannot update a complete order" + redirect_to root_path + else + @order.status = "complete" + if @order.update_attributes order_params + flash[:success] = "You successfully submitted your order!" + redirect_to root_path + session[:order_id] = nil + else + flash[:error] = "All fields are required to complete your order." + render :edit, status: :bad_request + end + end end end def destroy + @order = Order.find_by(id: params[:id]) + if !@order + redirect_to root_path, status: :not_found + else + @order.destroy + flash[:status] = :success + flash[:result_text] = "Successfully destroyed order number #{@order.id}" + redirect_to root_path + end end private - # def order_params - # return params.require(:order).permit(:status, :email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) - # end + def order_params + return params.require(:order).permit(:email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) + end end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 64a14f21a3..7a7e3809fe 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -36,188 +36,141 @@ must_respond_with :redirect Order.count.must_equal start_count + 1 end + it "sets the session[:order_id] to the id of the created order" do + post orders_path + session[:order_id].wont_equal nil + session[:order_id].must_equal Order.last.id + end + end - # it "renders bad_request and does not update the DB for bogus data" do - # work_data = { - # work: { - # title: "" - # } - # } - # CATEGORIES.each do |category| - # work_data[:work][:category] = category - # - # start_count = Work.count - # - # post works_path(category), params: work_data - # must_respond_with :bad_request - # - # Work.count.must_equal start_count - # end - # end - # - # it "renders 400 bad_request for bogus categories" do - # work_data = { - # work: { - # title: "test work" - # } - # } - # INVALID_CATEGORIES.each do |category| - # work_data[:work][:category] = category - # - # start_count = Work.count - # - # post works_path(category), params: work_data - # must_respond_with :bad_request - # - # Work.count.must_equal start_count - # end - # end - # end - # - # describe "show" do - # it "succeeds for an extant work ID" do - # get work_path(Work.first) - # must_respond_with :success - # end - # - # it "renders 404 not_found for a bogus work ID" do - # bogus_work_id = Work.last.id + 1 - # get work_path(bogus_work_id) - # must_respond_with :not_found - # end - # end - # - # describe "edit" do - # it "succeeds for an extant work ID" do - # get edit_work_path(Work.first) - # must_respond_with :success - # end - # - # it "renders 404 not_found for a bogus work ID" do - # bogus_work_id = Work.last.id + 1 - # get edit_work_path(bogus_work_id) - # must_respond_with :not_found - # end - # end - # - # describe "update" do - # it "succeeds for valid data and an extant work ID" do - # work = Work.first - # work_data = { - # work: { - # title: work.title + " addition" - # } - # } - # - # patch work_path(work), params: work_data - # must_redirect_to work_path(work) - # - # # Verify the DB was really modified - # Work.find(work.id).title.must_equal work_data[:work][:title] - # end - # - # it "renders bad_request for bogus data" do - # work = Work.first - # work_data = { - # work: { - # title: "" - # } - # } - # - # patch work_path(work), params: work_data - # must_respond_with :not_found - # - # # Verify the DB was not modified - # Work.find(work.id).title.must_equal work.title - # end - # - # it "renders 404 not_found for a bogus work ID" do - # bogus_work_id = Work.last.id + 1 - # get work_path(bogus_work_id) - # must_respond_with :not_found - # end - # end - # - # describe "destroy" do - # it "succeeds for an extant work ID" do - # work_id = Work.first.id - # - # delete work_path(work_id) - # must_redirect_to root_path - # - # # The work should really be gone - # Work.find_by(id: work_id).must_be_nil - # end - # - # it "renders 404 not_found and does not update the DB for a bogus work ID" do - # start_count = Work.count - # - # bogus_work_id = Work.last.id + 1 - # delete work_path(bogus_work_id) - # must_respond_with :not_found - # - # Work.count.must_equal start_count - # end - # end - # - # describe "upvote" do - # let(:user) { User.create!(username: "test_user") } - # let(:work) { Work.first } - # - # def login - # post login_path, params: { username: user.username } - # must_respond_with :redirect - # end - # - # def logout - # post logout_path - # must_respond_with :redirect - # end - # - # it "returns 401 unauthorized if no user is logged in" do - # start_vote_count = work.votes.count - # - # post upvote_path(work) - # must_respond_with :unauthorized - # - # work.votes.count.must_equal start_vote_count - # end - # - # it "returns 401 unauthorized after the user has logged out" do - # start_vote_count = work.votes.count - # - # login - # logout - # - # post upvote_path(work) - # must_respond_with :unauthorized - # - # work.votes.count.must_equal start_vote_count - # end - # - # it "succeeds for a logged-in user and a fresh user-vote pair" do - # start_vote_count = work.votes.count - # - # login - # - # post upvote_path(work) - # # Should be a redirect_back - # must_respond_with :redirect - # - # work.reload - # work.votes.count.must_equal start_vote_count + 1 - # end - # - # it "returns 409 conflict if the user has already voted for that work" do - # login - # Vote.create!(user: user, work: work) - # - # start_vote_count = work.votes.count - # - # post upvote_path(work) - # must_respond_with :conflict + describe "show" do + it "succeeds for an existing order" do + get order_path(Order.first) + must_respond_with :success + end + + it "renders 404 not_found for a bogus order ID" do + bogus_order_id = Order.last.id + 1 + get order_path(bogus_order_id) + must_respond_with :not_found + end + end # - # work.votes.count.must_equal start_vote_count - + describe "edit" do + it "succeeds for an existing order" do + order = orders(:pending_order) + get edit_order_path(order.id) + must_respond_with :success + end + + it "renders 404 not_found for a bogus order ID" do + bogus_order_id = Order.last.id + 1 + get edit_order_path(bogus_order_id) + must_respond_with :not_found + end + + it "does not allow edits to a complete order" do + order = orders(:complete_order) + get edit_order_path(order.id) + must_redirect_to root_path + end end + + describe "update" do + it "succeeds for valid data and an existing order ID" do + order = orders(:pending_order) + order_data = { + order: { + email: "buyer@email.com", + address: "100 Witchy Way, Seattle, WA", + name: "Gale", + card_number: "1234 1234 1234 1234", + card_exp: "01/21", + card_cvv: "546", + zip_code: "98122" + } + } + + patch order_path(order.id), params: order_data + must_redirect_to root_path + + # Verify the DB was really modified + Order.find(order.id).status.must_equal "complete" + end + + it "resets the session[:order_id] to nil when order is complete" do + order = orders(:pending_order) + order_data = { + order: { + email: "buyer@email.com", + address: "100 Witchy Way, Seattle, WA", + name: "Gale", + card_number: "1234 1234 1234 1234", + card_exp: "01/21", + card_cvv: "546", + zip_code: "98122" + } + } + + patch order_path(order.id), params: order_data + + session[:order_id].must_equal nil + end + + it "renders bad_request for insufficient buyer data" do + order = orders(:pending_order) + order_data = { + order: { + email: nil, + address: "100 Witchy Way, Seattle, WA", + name: "Gale", + card_number: "1234 1234 1234 1234", + card_exp: "01/21", + card_cvv: "546", + zip_code: "98122" + } + } + + patch order_path(order), params: order_data + must_respond_with :bad_request + + # Verify the DB was not modified + Order.find(order.id).status.must_equal "pending" + end + + it "renders 404 not_found for a bogus order ID" do + bogus_order_id = Order.last.id + 1 + get order_path(bogus_order_id) + must_respond_with :not_found + end + + it "does not allow changes to a complete order" do + order = orders(:complete_order) + get order_path(order.id) + must_redirect_to root_path + end + end + + describe "destroy" do + it "succeeds for an existing order" do + order = Order.first.id + + delete order_path(order) + must_redirect_to root_path + + # The work should really be gone + Order.find_by(id: order).must_be_nil + end + + it "renders 404 not_found and does not update the DB for a bogus order ID" do + start_count = Order.count + + bogus_order_id = Order.last.id + 1 + delete order_path(bogus_order_id) + must_respond_with :not_found + + Order.count.must_equal start_count + end + end + end From 6a4a211a595a64226b9bab54f7d39283a7ee73ad Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 08:31:03 -0700 Subject: [PATCH 035/210] Basic categories controller tests. --- Gemfile | 2 + Gemfile.lock | 7 +- app/assets/javascripts/application.js | 2 +- app/assets/javascripts/home.js | 3 + app/views/layouts/application.html.erb | 4 + app/views/products/root.html.erb | 4 +- config/initializers/assets.rb | 1 + ...fest-824e727ed97b6131d637fca833e48947.json | 1 + ...5b286762dd9e5dd7bf674fae25458c19ea76fa.css | 7156 ++++++ ...86762dd9e5dd7bf674fae25458c19ea76fa.css.gz | Bin 0 -> 22394 bytes ...b70b1133c86916304e78c5ae3ec6f77a475e86d.js | 20023 ++++++++++++++++ ...b1133c86916304e78c5ae3ec6f77a475e86d.js.gz | Bin 0 -> 125936 bytes ...a989f77df26d90b6c5fa303019cc7c00877b8a5.js | 176 + ...9f77df26d90b6c5fa303019cc7c00877b8a5.js.gz | Bin 0 -> 1655 bytes .../controllers/categories_controller_test.rb | 37 +- 15 files changed, 27410 insertions(+), 6 deletions(-) create mode 100644 public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json create mode 100644 public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css create mode 100644 public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css.gz create mode 100644 public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js create mode 100644 public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js.gz create mode 100644 public/assets/home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js create mode 100644 public/assets/home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js.gz diff --git a/Gemfile b/Gemfile index 5ab86d9376..b8ff0a423b 100644 --- a/Gemfile +++ b/Gemfile @@ -65,3 +65,5 @@ group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +gem 'jquery-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 70efec06c9..e6d3f82865 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -82,6 +82,10 @@ GEM jbuilder (2.7.0) activesupport (>= 4.2.0) multi_json (>= 1.2) + jquery-rails (4.3.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks @@ -211,6 +215,7 @@ DEPENDENCIES capybara (~> 2.13) foundation-rails (= 6.4.1.2) jbuilder (~> 2.5) + jquery-rails jquery-turbolinks listen (>= 3.0.5, < 3.2) minitest-rails @@ -229,4 +234,4 @@ DEPENDENCIES web-console (>= 3.3.0) BUNDLED WITH - 1.15.4 + 1.16.0.pre.2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index eb67538ad7..17065a8367 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,10 +10,10 @@ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // +//= require home.js //= require rails-ujs //= require foundation //= require turbolinks -//= require home //= require_tree . diff --git a/app/assets/javascripts/home.js b/app/assets/javascripts/home.js index ad985901cf..a770edcbdb 100644 --- a/app/assets/javascripts/home.js +++ b/app/assets/javascripts/home.js @@ -1,3 +1,6 @@ +console.log("This is a test"); + + // Create an array to store our particles var particles = []; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 2ff58552e7..5049f8c568 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,7 +10,11 @@ <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> + + + <%= yield :head %> diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index 7c5bf56bfc..024e2c333b 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -8,7 +8,9 @@ src="/Users/kimberley/ada/week-ten/betsy/app/assets/javascripts/home.js" - + <% content_for :head do %> + <%= javascript_include_tag "home.js" %> + <% end %> diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 7589aaf38e..f7617edb52 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -12,4 +12,5 @@ # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. # Rails.application.config.assets.precompile += %w( admin.js admin.css ) + Rails.application.config.assets.precompile += %w( home.js ) diff --git a/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json b/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json new file mode 100644 index 0000000000..2f88b6a0a8 --- /dev/null +++ b/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json @@ -0,0 +1 @@ +{"files":{"home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js":{"logical_path":"home.js","mtime":"2017-10-17T17:10:52-07:00","size":5071,"digest":"c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5","integrity":"sha256-xbpShLLifyC9mBaAOpifd98m2QtsX6MDAZzHwAh3uKU="},"application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js":{"logical_path":"application.js","mtime":"2017-10-18T18:21:55-07:00","size":738085,"digest":"8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d","integrity":"sha256-itb4Z7/wqrUbMbcgq3CxEzyGkWME54xa4+xvd6R16G0="},"application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css":{"logical_path":"application.css","mtime":"2017-10-18T15:09:51-07:00","size":264628,"digest":"1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa","integrity":"sha256-H4ovUebvz9QuVU9KmFsoZ2Ldnl3Xv2dPriVFjBnqdvo="}},"assets":{"home.js":"home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js","application.js":"application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js","application.css":"application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css"}} \ No newline at end of file diff --git a/public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css b/public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css new file mode 100644 index 0000000000..570662309f --- /dev/null +++ b/public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css @@ -0,0 +1,7156 @@ +@charset "UTF-8"; +/** + * Foundation for Sites by ZURB + * Version 6.4.1 + * foundation.zurb.com + * Licensed under MIT Open Source + */ +@media print, screen and (min-width: 40em) { + /* line 45, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal, .reveal.tiny, .reveal.small, .reveal.large { + right: auto; + left: auto; + margin: 0 auto; + } +} +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ +/* Document + ========================================================================== */ +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ +/* line 59, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +html { + font-family: sans-serif; + /* 1 */ + line-height: 1.15; + /* 2 */ + -ms-text-size-adjust: 100%; + /* 3 */ + -webkit-text-size-adjust: 100%; + /* 3 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +/* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ +/* line 91, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +/* line 105, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +/* line 198, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +figcaption, +figure { + display: block; +} + +/** + * Add the correct margin in IE 8. + */ +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +/* line 221, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * Add the correct display in IE. + */ +/* line 231, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +main { + display: block; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +/* line 251, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Links + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +/* line 266, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ +/* line 276, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +a:active, +a:hover { + outline-width: 0; +} + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +/* line 291, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +/* line 301, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +/* line 310, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +/* line 320, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ +/* line 339, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ +/* line 348, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +/* line 357, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +/* line 365, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +sub { + bottom: -0.25em; +} + +/* line 369, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +/* line 382, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ +/* line 391, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ +/* line 400, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ +/* line 408, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +/* line 422, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + */ +/* line 442, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +/* line 451, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +/* line 462, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ +} + +/* line 469, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button, +[type="button"], +[type="reset"], +[type="submit"] { + /** + * Remove the inner border and padding in Firefox. + */ + /** + * Restore the focus styles unset by the previous rule. + */ +} +/* line 478, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} +/* line 487, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Show the overflow in Edge. + */ +/* line 496, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +input { + overflow: visible; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +/* line 505, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +/* line 515, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +/* line 525, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ +} +/* line 533, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +/* line 544, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ +/* line 553, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +/* line 566, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +legend { + box-sizing: border-box; + /* 1 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + color: inherit; + /* 2 */ + white-space: normal; + /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +/* line 580, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ +/* line 589, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +textarea { + overflow: auto; +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE, and Firefox. + */ +/* line 602, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +/* line 610, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +summary { + display: list-item; +} + +/* + * Add the correct display in IE 9-. + */ +/* line 618, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +menu { + display: block; +} + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +/* line 651, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ +/* line 659, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +template { + display: none; +} + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +/* line 672, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/_vendor/normalize-scss/sass/normalize/_normalize-mixin.scss */ +[hidden] { + display: none; +} + +/* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +.foundation-mq { + font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; +} + +/* line 139, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +html { + box-sizing: border-box; + font-size: 100%; +} + +/* line 145, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +*, +*::before, +*::after { + box-sizing: inherit; +} + +/* line 152, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +body { + margin: 0; + padding: 0; + background: #fefefe; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +img { + display: inline-block; + vertical-align: middle; + max-width: 100%; + height: auto; + -ms-interpolation-mode: bicubic; +} + +/* line 181, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +textarea { + height: auto; + min-height: 50px; + border-radius: 0; +} + +/* line 188, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +select { + box-sizing: border-box; + width: 100%; + border-radius: 0; +} + +/* line 198, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +.map_canvas img, +.map_canvas embed, +.map_canvas object, +.mqa-display img, +.mqa-display embed, +.mqa-display object { + max-width: none !important; +} + +/* line 206, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +button { + padding: 0; + appearance: none; + border: 0; + border-radius: 0; + background: transparent; + line-height: 1; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] button { + outline: 0; +} + +/* line 220, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +pre { + overflow: auto; +} + +/* line 225, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; +} + +/* line 234, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +.is-visible { + display: block !important; +} + +/* line 238, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/_global.scss */ +.is-hidden { + display: none !important; +} + +/* line 28, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row { + max-width: 75rem; + margin-right: auto; + margin-left: auto; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.row::before, .row::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.row::after { + clear: both; +} +/* line 33, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row.collapse > .column, .row.collapse > .columns { + padding-right: 0; + padding-left: 0; +} +/* line 39, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row .row { + margin-right: -0.625rem; + margin-left: -0.625rem; +} +@media print, screen and (min-width: 40em) { + /* line 39, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; + } +} +@media print, screen and (min-width: 64em) { + /* line 39, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; + } +} +/* line 42, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row .row.collapse { + margin-right: 0; + margin-left: 0; +} +/* line 49, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row.expanded { + max-width: none; +} +/* line 52, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row.expanded .row { + margin-right: auto; + margin-left: auto; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row:not(.expanded) .row { + max-width: none; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row.gutter-small > .column, .row.gutter-small > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row.gutter-medium > .column, .row.gutter-medium > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; +} + +/* line 76, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.column, .columns { + width: 100%; + float: left; + padding-right: 0.625rem; + padding-left: 0.625rem; +} +@media print, screen and (min-width: 40em) { + /* line 76, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .column, .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; + } +} +/* line 68, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_column.scss */ +.column:last-child:not(:first-child), .columns:last-child:not(:first-child) { + float: right; +} +/* line 49, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_position.scss */ +.column.end:last-child:last-child, .end.columns:last-child:last-child { + float: left; +} + +/* line 88, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.column.row.row, .row.row.columns { + float: none; +} + +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.row .column.row.row, .row .row.row.columns { + margin-right: 0; + margin-left: 0; + padding-right: 0; + padding-left: 0; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-1 { + width: 8.33333%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-1 { + position: relative; + left: 8.33333%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-1 { + position: relative; + left: -8.33333%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-0 { + margin-left: 0%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-2 { + width: 16.66667%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-2 { + position: relative; + left: 16.66667%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-2 { + position: relative; + left: -16.66667%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-1 { + margin-left: 8.33333%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-3 { + width: 25%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-3 { + position: relative; + left: 25%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-3 { + position: relative; + left: -25%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-2 { + margin-left: 16.66667%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-4 { + width: 33.33333%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-4 { + position: relative; + left: 33.33333%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-4 { + position: relative; + left: -33.33333%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-3 { + margin-left: 25%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-5 { + width: 41.66667%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-5 { + position: relative; + left: 41.66667%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-5 { + position: relative; + left: -41.66667%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-4 { + margin-left: 33.33333%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-6 { + width: 50%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-6 { + position: relative; + left: 50%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-6 { + position: relative; + left: -50%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-5 { + margin-left: 41.66667%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-7 { + width: 58.33333%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-7 { + position: relative; + left: 58.33333%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-7 { + position: relative; + left: -58.33333%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-6 { + margin-left: 50%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-8 { + width: 66.66667%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-8 { + position: relative; + left: 66.66667%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-8 { + position: relative; + left: -66.66667%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-7 { + margin-left: 58.33333%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-9 { + width: 75%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-9 { + position: relative; + left: 75%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-9 { + position: relative; + left: -75%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-8 { + margin-left: 66.66667%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-10 { + width: 83.33333%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-10 { + position: relative; + left: 83.33333%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-10 { + position: relative; + left: -83.33333%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-9 { + margin-left: 75%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-11 { + width: 91.66667%; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-push-11 { + position: relative; + left: 91.66667%; +} + +/* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-pull-11 { + position: relative; + left: -91.66667%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-10 { + margin-left: 83.33333%; +} + +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-12 { + width: 100%; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-offset-11 { + margin-left: 91.66667%; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-1 > .column, .small-up-1 > .columns { + float: left; + width: 100%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-2 > .column, .small-up-2 > .columns { + float: left; + width: 50%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-3 > .column, .small-up-3 > .columns { + float: left; + width: 33.33333%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-4 > .column, .small-up-4 > .columns { + float: left; + width: 25%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-5 > .column, .small-up-5 > .columns { + float: left; + width: 20%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-6 > .column, .small-up-6 > .columns { + float: left; + width: 16.66667%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-7 > .column, .small-up-7 > .columns { + float: left; + width: 14.28571%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { + float: left; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-8 > .column, .small-up-8 > .columns { + float: left; + width: 12.5%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { + clear: none; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { + clear: both; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ +.small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { + float: left; +} + +/* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-collapse > .column, .small-collapse > .columns { + padding-right: 0; + padding-left: 0; +} +/* line 137, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-collapse .row { + margin-right: 0; + margin-left: 0; +} + +/* line 143, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.expanded.row .small-collapse.row { + margin-right: 0; + margin-left: 0; +} + +/* line 149, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-uncollapse > .column, .small-uncollapse > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; +} + +/* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-centered { + margin-right: auto; + margin-left: auto; +} +/* line 20, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_position.scss */ +.small-centered, .small-centered:last-child:not(:first-child) { + float: none; + clear: both; +} + +/* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.small-uncentered, +.small-push-0, +.small-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; +} + +@media print, screen and (min-width: 40em) { + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-1 { + width: 8.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-1 { + position: relative; + left: 8.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-1 { + position: relative; + left: -8.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-0 { + margin-left: 0%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-2 { + width: 16.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-2 { + position: relative; + left: 16.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-2 { + position: relative; + left: -16.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-1 { + margin-left: 8.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-3 { + width: 25%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-3 { + position: relative; + left: 25%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-3 { + position: relative; + left: -25%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-2 { + margin-left: 16.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-4 { + width: 33.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-4 { + position: relative; + left: 33.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-4 { + position: relative; + left: -33.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-3 { + margin-left: 25%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-5 { + width: 41.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-5 { + position: relative; + left: 41.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-5 { + position: relative; + left: -41.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-4 { + margin-left: 33.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-6 { + width: 50%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-6 { + position: relative; + left: 50%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-6 { + position: relative; + left: -50%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-5 { + margin-left: 41.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-7 { + width: 58.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-7 { + position: relative; + left: 58.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-7 { + position: relative; + left: -58.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-6 { + margin-left: 50%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-8 { + width: 66.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-8 { + position: relative; + left: 66.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-8 { + position: relative; + left: -66.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-7 { + margin-left: 58.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-9 { + width: 75%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-9 { + position: relative; + left: 75%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-9 { + position: relative; + left: -75%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-8 { + margin-left: 66.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-10 { + width: 83.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-10 { + position: relative; + left: 83.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-10 { + position: relative; + left: -83.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-9 { + margin-left: 75%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-11 { + width: 91.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-push-11 { + position: relative; + left: 91.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-pull-11 { + position: relative; + left: -91.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-10 { + margin-left: 83.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-12 { + width: 100%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-offset-11 { + margin-left: 91.66667%; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-1 > .column, .medium-up-1 > .columns { + float: left; + width: 100%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-2 > .column, .medium-up-2 > .columns { + float: left; + width: 50%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-3 > .column, .medium-up-3 > .columns { + float: left; + width: 33.33333%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-4 > .column, .medium-up-4 > .columns { + float: left; + width: 25%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-5 > .column, .medium-up-5 > .columns { + float: left; + width: 20%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-6 > .column, .medium-up-6 > .columns { + float: left; + width: 16.66667%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-7 > .column, .medium-up-7 > .columns { + float: left; + width: 14.28571%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-8 > .column, .medium-up-8 > .columns { + float: left; + width: 12.5%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { + float: left; + } + + /* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-collapse > .column, .medium-collapse > .columns { + padding-right: 0; + padding-left: 0; + } + /* line 137, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-collapse .row { + margin-right: 0; + margin-left: 0; + } + + /* line 143, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .expanded.row .medium-collapse.row { + margin-right: 0; + margin-left: 0; + } + + /* line 149, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-uncollapse > .column, .medium-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; + } + + /* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-centered { + margin-right: auto; + margin-left: auto; + } + /* line 20, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_position.scss */ + .medium-centered, .medium-centered:last-child:not(:first-child) { + float: none; + clear: both; + } + + /* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .medium-uncentered, + .medium-push-0, + .medium-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; + } +} +@media print, screen and (min-width: 64em) { + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-1 { + width: 8.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-1 { + position: relative; + left: 8.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-1 { + position: relative; + left: -8.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-0 { + margin-left: 0%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-2 { + width: 16.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-2 { + position: relative; + left: 16.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-2 { + position: relative; + left: -16.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-1 { + margin-left: 8.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-3 { + width: 25%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-3 { + position: relative; + left: 25%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-3 { + position: relative; + left: -25%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-2 { + margin-left: 16.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-4 { + width: 33.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-4 { + position: relative; + left: 33.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-4 { + position: relative; + left: -33.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-3 { + margin-left: 25%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-5 { + width: 41.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-5 { + position: relative; + left: 41.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-5 { + position: relative; + left: -41.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-4 { + margin-left: 33.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-6 { + width: 50%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-6 { + position: relative; + left: 50%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-6 { + position: relative; + left: -50%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-5 { + margin-left: 41.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-7 { + width: 58.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-7 { + position: relative; + left: 58.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-7 { + position: relative; + left: -58.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-6 { + margin-left: 50%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-8 { + width: 66.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-8 { + position: relative; + left: 66.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-8 { + position: relative; + left: -66.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-7 { + margin-left: 58.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-9 { + width: 75%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-9 { + position: relative; + left: 75%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-9 { + position: relative; + left: -75%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-8 { + margin-left: 66.66667%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-10 { + width: 83.33333%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-10 { + position: relative; + left: 83.33333%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-10 { + position: relative; + left: -83.33333%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-9 { + margin-left: 75%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-11 { + width: 91.66667%; + } + + /* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-push-11 { + position: relative; + left: 91.66667%; + } + + /* line 113, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-pull-11 { + position: relative; + left: -91.66667%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-10 { + margin-left: 83.33333%; + } + + /* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-12 { + width: 100%; + } + + /* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-offset-11 { + margin-left: 91.66667%; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-1 > .column, .large-up-1 > .columns { + float: left; + width: 100%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-2 > .column, .large-up-2 > .columns { + float: left; + width: 50%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-3 > .column, .large-up-3 > .columns { + float: left; + width: 33.33333%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-4 > .column, .large-up-4 > .columns { + float: left; + width: 25%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-5 > .column, .large-up-5 > .columns { + float: left; + width: 20%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-6 > .column, .large-up-6 > .columns { + float: left; + width: 16.66667%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-7 > .column, .large-up-7 > .columns { + float: left; + width: 14.28571%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { + float: left; + } + + /* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-8 > .column, .large-up-8 > .columns { + float: left; + width: 12.5%; + } + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { + clear: none; + } + /* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { + clear: both; + } + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_layout.scss */ + .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { + float: left; + } + + /* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-collapse > .column, .large-collapse > .columns { + padding-right: 0; + padding-left: 0; + } + /* line 137, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-collapse .row { + margin-right: 0; + margin-left: 0; + } + + /* line 143, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .expanded.row .large-collapse.row { + margin-right: 0; + margin-left: 0; + } + + /* line 149, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-uncollapse > .column, .large-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; + } + + /* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-centered { + margin-right: auto; + margin-left: auto; + } + /* line 20, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_position.scss */ + .large-centered, .large-centered:last-child:not(:first-child) { + float: none; + clear: both; + } + + /* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .large-uncentered, + .large-push-0, + .large-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; + } +} +/* line 166, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ +.column-block { + margin-bottom: 1.25rem; +} +/* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_gutter.scss */ +.column-block > :last-child { + margin-bottom: 0; +} +@media print, screen and (min-width: 40em) { + /* line 166, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_classes.scss */ + .column-block { + margin-bottom: 1.875rem; + } + /* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/grid/_gutter.scss */ + .column-block > :last-child { + margin-bottom: 0; + } +} + +/* line 256, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; +} + +/* line 280, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +p { + margin-bottom: 1rem; + font-size: inherit; + line-height: 1.6; + text-rendering: optimizeLegibility; +} + +/* line 289, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +em, +i { + font-style: italic; + line-height: inherit; +} + +/* line 296, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +strong, +b { + font-weight: bold; + line-height: inherit; +} + +/* line 303, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +small { + font-size: 80%; + line-height: inherit; +} + +/* line 309, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-style: normal; + font-weight: normal; + color: inherit; + text-rendering: optimizeLegibility; +} +/* line 321, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + line-height: 0; + color: #cacaca; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h1 { + font-size: 1.5rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h2 { + font-size: 1.25rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h3 { + font-size: 1.1875rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h4 { + font-size: 1.125rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h5 { + font-size: 1.0625rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +/* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +h6 { + font-size: 1rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; +} + +@media print, screen and (min-width: 40em) { + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h1 { + font-size: 3rem; + } + + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h2 { + font-size: 2.5rem; + } + + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h3 { + font-size: 1.9375rem; + } + + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h4 { + font-size: 1.5625rem; + } + + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h5 { + font-size: 1.25rem; + } + + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ + h6 { + font-size: 1rem; + } +} +/* line 371, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +a { + line-height: inherit; + color: #1779ba; + text-decoration: none; + cursor: pointer; +} +/* line 378, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +a:hover, a:focus { + color: #1468a0; +} +/* line 386, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +a img { + border: 0; +} + +/* line 392, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +hr { + clear: both; + max-width: 75rem; + height: 0; + margin: 1.25rem auto; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #cacaca; + border-left: 0; +} + +/* line 406, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +ul, +ol, +dl { + margin-bottom: 1rem; + list-style-position: outside; + line-height: 1.6; +} + +/* line 415, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +li { + font-size: inherit; +} + +/* line 420, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +ul { + margin-left: 1.25rem; + list-style-type: disc; +} + +/* line 426, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +ol { + margin-left: 1.25rem; +} + +/* line 432, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +ul ul, ol ul, ul ol, ol ol { + margin-left: 1.25rem; + margin-bottom: 0; +} + +/* line 439, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +dl { + margin-bottom: 1rem; +} +/* line 442, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +dl dt { + margin-bottom: 0.3rem; + font-weight: bold; +} + +/* line 449, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +blockquote { + margin: 0 0 1rem; + padding: 0.5625rem 1.25rem 0 1.1875rem; + border-left: 1px solid #cacaca; +} +/* line 454, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +blockquote, blockquote p { + line-height: 1.6; + color: #8a8a8a; +} + +/* line 461, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +cite { + display: block; + font-size: 0.8125rem; + color: #8a8a8a; +} +/* line 466, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +cite:before { + content: "— "; +} + +/* line 472, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +abbr, abbr[title] { + border-bottom: 1px dotted #0a0a0a; + cursor: help; + text-decoration: none; +} + +/* line 479, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +figure { + margin: 0; +} + +/* line 484, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +code { + padding: 0.125rem 0.3125rem 0.0625rem; + border: 1px solid #cacaca; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #0a0a0a; +} + +/* line 496, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_base.scss */ +kbd { + margin: 0; + padding: 0.125rem 0.25rem 0; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + color: #0a0a0a; +} + +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_helpers.scss */ +.subheader { + margin-top: 0.2rem; + margin-bottom: 0.5rem; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; +} + +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_helpers.scss */ +.lead { + font-size: 125%; + line-height: 1.6; +} + +/* line 64, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_helpers.scss */ +.stat { + font-size: 2.5rem; + line-height: 1; +} +/* line 68, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_helpers.scss */ +p + .stat { + margin-top: -1rem; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_helpers.scss */ +ul.no-bullet, ol.no-bullet { + margin-left: 0; + list-style: none; +} + +/* line 15, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ +.text-left { + text-align: left; +} + +/* line 15, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ +.text-right { + text-align: right; +} + +/* line 15, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ +.text-center { + text-align: center; +} + +/* line 15, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ +.text-justify { + text-align: justify; +} + +@media print, screen and (min-width: 40em) { + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .medium-text-left { + text-align: left; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .medium-text-right { + text-align: right; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .medium-text-center { + text-align: center; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .medium-text-justify { + text-align: justify; + } +} +@media print, screen and (min-width: 64em) { + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .large-text-left { + text-align: left; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .large-text-right { + text-align: right; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .large-text-center { + text-align: center; + } + + /* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_alignment.scss */ + .large-text-justify { + text-align: justify; + } +} +/* line 14, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ +.show-for-print { + display: none !important; +} + +@media print { + /* line 17, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + * { + background: transparent !important; + box-shadow: none !important; + color: black !important; + text-shadow: none !important; + } + + /* line 28, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + .show-for-print { + display: block !important; + } + + /* line 29, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + .hide-for-print { + display: none !important; + } + + /* line 31, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + table.show-for-print { + display: table !important; + } + + /* line 32, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + thead.show-for-print { + display: table-header-group !important; + } + + /* line 33, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + tbody.show-for-print { + display: table-row-group !important; + } + + /* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + tr.show-for-print { + display: table-row !important; + } + + /* line 35, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + td.show-for-print { + display: table-cell !important; + } + + /* line 36, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + th.show-for-print { + display: table-cell !important; + } + + /* line 39, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + a, + a:visited { + text-decoration: underline; + } + + /* line 42, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + a[href]:after { + content: " (" attr(href) ")"; + } + + /* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + .ir a:after, + a[href^='javascript:']:after, + a[href^='#']:after { + content: ''; + } + + /* line 51, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + abbr[title]:after { + content: " (" attr(title) ")"; + } + + /* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + pre, + blockquote { + border: 1px solid #8a8a8a; + page-break-inside: avoid; + } + + /* line 61, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + thead { + display: table-header-group; + } + + /* line 63, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + tr, + img { + page-break-inside: avoid; + } + + /* line 66, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + /* line 70, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + /* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + h2, + h3 { + page-break-after: avoid; + } + + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/typography/_print.scss */ + .print-break-inside { + page-break-inside: auto; + } +} +/* line 262, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button { + display: inline-block; + vertical-align: middle; + margin: 0 0 1rem 0; + font-family: inherit; + padding: 0.85em 1em; + -webkit-appearance: none; + border: 1px solid transparent; + border-radius: 0; + transition: background-color 0.25s ease-out, color 0.25s ease-out; + font-size: 0.9rem; + line-height: 1; + text-align: center; + cursor: pointer; + background-color: #1779ba; + color: #fefefe; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .button { + outline: 0; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button:hover, .button:focus { + background-color: #14679e; + color: #fefefe; +} +/* line 267, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.tiny { + font-size: 0.6rem; +} +/* line 267, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.small { + font-size: 0.75rem; +} +/* line 267, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.large { + font-size: 1.25rem; +} +/* line 272, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.expanded { + display: block; + width: 100%; + margin-right: 0; + margin-left: 0; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.primary { + background-color: #1779ba; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.primary:hover, .button.primary:focus { + background-color: #126195; + color: #fefefe; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.secondary { + background-color: #767676; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.secondary:hover, .button.secondary:focus { + background-color: #5e5e5e; + color: #fefefe; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.success { + background-color: #3adb76; + color: #0a0a0a; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.success:hover, .button.success:focus { + background-color: #22bb5b; + color: #0a0a0a; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.warning { + background-color: #ffae00; + color: #0a0a0a; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.warning:hover, .button.warning:focus { + background-color: #cc8b00; + color: #0a0a0a; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.alert { + background-color: #cc4b37; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.alert:hover, .button.alert:focus { + background-color: #a53b2a; + color: #fefefe; +} +/* line 293, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled, .button[disabled] { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus { + background-color: #1779ba; + color: #fefefe; +} +/* line 298, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.primary, .button[disabled].primary { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.primary, .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary, .button[disabled].primary:hover, .button[disabled].primary:focus { + background-color: #1779ba; + color: #fefefe; +} +/* line 298, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.secondary, .button[disabled].secondary { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.secondary, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #767676; + color: #fefefe; +} +/* line 298, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.success, .button[disabled].success { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.success, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #3adb76; + color: #0a0a0a; +} +/* line 298, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.warning, .button[disabled].warning { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.warning, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning, .button[disabled].warning:hover, .button[disabled].warning:focus { + background-color: #ffae00; + color: #0a0a0a; +} +/* line 298, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.alert, .button[disabled].alert { + opacity: 0.25; + cursor: not-allowed; +} +/* line 207, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.disabled.alert, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #cc4b37; + color: #fefefe; +} +/* line 306, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow, .button.hollow:hover, .button.hollow:focus { + background-color: transparent; +} +/* line 165, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.disabled, .button.hollow.disabled:hover, .button.hollow.disabled:focus, .button.hollow[disabled], .button.hollow[disabled]:hover, .button.hollow[disabled]:focus { + background-color: transparent; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow:hover, .button.hollow:focus { + border-color: #0c3d5d; + color: #0c3d5d; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow:hover.disabled, .button.hollow:hover[disabled], .button.hollow:focus.disabled, .button.hollow:focus[disabled] { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 311, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.primary { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.primary:hover, .button.hollow.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.primary:hover.disabled, .button.hollow.primary:hover[disabled], .button.hollow.primary:focus.disabled, .button.hollow.primary:focus[disabled] { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 311, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.secondary { + border: 1px solid #767676; + color: #767676; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.secondary:hover, .button.hollow.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.secondary:hover.disabled, .button.hollow.secondary:hover[disabled], .button.hollow.secondary:focus.disabled, .button.hollow.secondary:focus[disabled] { + border: 1px solid #767676; + color: #767676; +} +/* line 311, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.success { + border: 1px solid #3adb76; + color: #3adb76; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.success:hover, .button.hollow.success:focus { + border-color: #157539; + color: #157539; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.success:hover.disabled, .button.hollow.success:hover[disabled], .button.hollow.success:focus.disabled, .button.hollow.success:focus[disabled] { + border: 1px solid #3adb76; + color: #3adb76; +} +/* line 311, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.warning { + border: 1px solid #ffae00; + color: #ffae00; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.warning:hover, .button.hollow.warning:focus { + border-color: #805700; + color: #805700; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.warning:hover.disabled, .button.hollow.warning:hover[disabled], .button.hollow.warning:focus.disabled, .button.hollow.warning:focus[disabled] { + border: 1px solid #ffae00; + color: #ffae00; +} +/* line 311, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.alert { + border: 1px solid #cc4b37; + color: #cc4b37; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.alert:hover, .button.hollow.alert:focus { + border-color: #67251a; + color: #67251a; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.hollow.alert:hover.disabled, .button.hollow.alert:hover[disabled], .button.hollow.alert:focus.disabled, .button.hollow.alert:focus[disabled] { + border: 1px solid #cc4b37; + color: #cc4b37; +} +/* line 320, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear, .button.clear:hover, .button.clear:focus { + background-color: transparent; +} +/* line 165, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.disabled, .button.clear.disabled:hover, .button.clear.disabled:focus, .button.clear[disabled], .button.clear[disabled]:hover, .button.clear[disabled]:focus { + background-color: transparent; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear:hover, .button.clear:focus { + border-color: #0c3d5d; + color: #0c3d5d; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear:hover.disabled, .button.clear:hover[disabled], .button.clear:focus.disabled, .button.clear:focus[disabled] { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 325, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear, .button.clear.disabled, .button.clear[disabled], .button.clear:hover, .button.clear:hover.disabled, .button.clear:hover[disabled], .button.clear:focus, .button.clear:focus.disabled, .button.clear:focus[disabled] { + border-color: transparent; +} +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.primary { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.primary:hover, .button.clear.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.primary:hover.disabled, .button.clear.primary:hover[disabled], .button.clear.primary:focus.disabled, .button.clear.primary:focus[disabled] { + border: 1px solid #1779ba; + color: #1779ba; +} +/* line 336, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.primary, .button.clear.primary.disabled, .button.clear.primary[disabled], .button.clear.primary:hover, .button.clear.primary:hover.disabled, .button.clear.primary:hover[disabled], .button.clear.primary:focus, .button.clear.primary:focus.disabled, .button.clear.primary:focus[disabled] { + border-color: transparent; +} +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.secondary { + border: 1px solid #767676; + color: #767676; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.secondary:hover, .button.clear.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.secondary:hover.disabled, .button.clear.secondary:hover[disabled], .button.clear.secondary:focus.disabled, .button.clear.secondary:focus[disabled] { + border: 1px solid #767676; + color: #767676; +} +/* line 336, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.secondary, .button.clear.secondary.disabled, .button.clear.secondary[disabled], .button.clear.secondary:hover, .button.clear.secondary:hover.disabled, .button.clear.secondary:hover[disabled], .button.clear.secondary:focus, .button.clear.secondary:focus.disabled, .button.clear.secondary:focus[disabled] { + border-color: transparent; +} +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.success { + border: 1px solid #3adb76; + color: #3adb76; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.success:hover, .button.clear.success:focus { + border-color: #157539; + color: #157539; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.success:hover.disabled, .button.clear.success:hover[disabled], .button.clear.success:focus.disabled, .button.clear.success:focus[disabled] { + border: 1px solid #3adb76; + color: #3adb76; +} +/* line 336, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.success, .button.clear.success.disabled, .button.clear.success[disabled], .button.clear.success:hover, .button.clear.success:hover.disabled, .button.clear.success:hover[disabled], .button.clear.success:focus, .button.clear.success:focus.disabled, .button.clear.success:focus[disabled] { + border-color: transparent; +} +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.warning { + border: 1px solid #ffae00; + color: #ffae00; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.warning:hover, .button.clear.warning:focus { + border-color: #805700; + color: #805700; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.warning:hover.disabled, .button.clear.warning:hover[disabled], .button.clear.warning:focus.disabled, .button.clear.warning:focus[disabled] { + border: 1px solid #ffae00; + color: #ffae00; +} +/* line 336, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.warning, .button.clear.warning.disabled, .button.clear.warning[disabled], .button.clear.warning:hover, .button.clear.warning:hover.disabled, .button.clear.warning:hover[disabled], .button.clear.warning:focus, .button.clear.warning:focus.disabled, .button.clear.warning:focus[disabled] { + border-color: transparent; +} +/* line 331, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.alert { + border: 1px solid #cc4b37; + color: #cc4b37; +} +/* line 182, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.alert:hover, .button.clear.alert:focus { + border-color: #67251a; + color: #67251a; +} +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.alert:hover.disabled, .button.clear.alert:hover[disabled], .button.clear.alert:focus.disabled, .button.clear.alert:focus[disabled] { + border: 1px solid #cc4b37; + color: #cc4b37; +} +/* line 336, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.clear.alert, .button.clear.alert.disabled, .button.clear.alert[disabled], .button.clear.alert:hover, .button.clear.alert:hover.disabled, .button.clear.alert:hover[disabled], .button.clear.alert:focus, .button.clear.alert:focus.disabled, .button.clear.alert:focus[disabled] { + border-color: transparent; +} +/* line 222, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown::after { + display: block; + width: 0; + height: 0; + border: inset 0.4em; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #fefefe transparent transparent; + position: relative; + top: 0.4em; + display: inline-block; + float: right; + margin-left: 1em; +} +/* line 358, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow::after { + border-top-color: #1779ba; +} +/* line 364, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow.primary::after { + border-top-color: #1779ba; +} +/* line 364, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow.secondary::after { + border-top-color: #767676; +} +/* line 364, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow.success::after { + border-top-color: #3adb76; +} +/* line 364, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow.warning::after { + border-top-color: #ffae00; +} +/* line 364, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.dropdown.hollow.alert::after { + border-top-color: #cc4b37; +} +/* line 373, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button.arrow-only::after { + top: -0.1em; + float: none; + margin-left: 0; +} + +/* line 125, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], +textarea { + display: block; + box-sizing: border-box; + width: 100%; + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + font-family: inherit; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + appearance: none; +} +/* line 111, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +[type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, +textarea:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +} + +/* line 132, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +textarea { + max-width: 100%; +} +/* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +textarea[rows] { + height: auto; +} + +/* line 143, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +input::placeholder, +textarea::placeholder { + color: #cacaca; +} +/* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +input:disabled, input[readonly], +textarea:disabled, +textarea[readonly] { + background-color: #e6e6e6; + cursor: not-allowed; +} + +/* line 156, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +[type='submit'], +[type='button'] { + appearance: none; + border-radius: 0; +} + +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_text.scss */ +input[type='search'] { + box-sizing: border-box; +} + +/* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_checkbox.scss */ +[type='file'], +[type='checkbox'], +[type='radio'] { + margin: 0 0 1rem; +} + +/* line 17, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_checkbox.scss */ +[type='checkbox'] + label, +[type='radio'] + label { + display: inline-block; + vertical-align: baseline; + margin-left: 0.5rem; + margin-right: 1rem; + margin-bottom: 0; +} +/* line 26, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_checkbox.scss */ +[type='checkbox'] + label[for], +[type='radio'] + label[for] { + cursor: pointer; +} + +/* line 32, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_checkbox.scss */ +label > [type='checkbox'], +label > [type='radio'] { + margin-right: 0.5rem; +} + +/* line 38, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_checkbox.scss */ +[type='file'] { + width: 100%; +} + +/* line 43, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_label.scss */ +label { + display: block; + margin: 0; + font-size: 0.875rem; + font-weight: normal; + line-height: 1.8; + color: #0a0a0a; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_label.scss */ +label.middle { + margin: 0 0 1rem; + padding: 0.5625rem 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_help-text.scss */ +.help-text { + margin-top: -0.5rem; + font-size: 0.8125rem; + font-style: italic; + color: #0a0a0a; +} + +/* line 27, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group { + display: flex; + width: 100%; + margin-bottom: 1rem; + align-items: stretch; +} +/* line 36, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group > :first-child { + border-radius: 0 0 0 0; +} +/* line 41, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group > :last-child > * { + border-radius: 0 0 0 0; +} + +/* line 47, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-label, .input-group-field, .input-group-button, .input-group-button a, +.input-group-button input, +.input-group-button button, +.input-group-button label { + margin: 0; + white-space: nowrap; +} + +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-label { + padding: 0 1rem; + border: 1px solid #cacaca; + background: #e6e6e6; + color: #0a0a0a; + text-align: center; + white-space: nowrap; + display: flex; + flex: 0 0 auto; + align-items: center; +} +/* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-label:first-child { + border-right: 0; +} +/* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-label:last-child { + border-left: 0; +} + +/* line 88, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-field { + border-radius: 0; + flex: 1 1 0px; + height: auto; + min-width: 0; +} + +/* line 102, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-button { + padding-top: 0; + padding-bottom: 0; + text-align: center; + flex: 0 0 auto; +} +/* line 116, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_input-group.scss */ +.input-group-button a, +.input-group-button input, +.input-group-button button, +.input-group-button label { + height: 2.5rem; + padding-top: 0; + padding-bottom: 0; + font-size: 1rem; +} + +/* line 39, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_fieldset.scss */ +fieldset { + margin: 0; + padding: 0; + border: 0; +} + +/* line 45, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_fieldset.scss */ +legend { + max-width: 100%; + margin-bottom: 0.5rem; +} + +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_fieldset.scss */ +.fieldset { + margin: 1.125rem 0; + padding: 1.25rem; + border: 1px solid #cacaca; +} +/* line 30, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_fieldset.scss */ +.fieldset legend { + margin: 0; + margin-left: -0.1875rem; + padding: 0 0.1875rem; +} + +/* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ +select { + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + appearance: none; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-family: inherit; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + background-image: url("data:image/svg+xml;utf8,"); + background-origin: content-box; + background-position: right -1rem center; + background-repeat: no-repeat; + background-size: 9px 6px; + padding-right: 1.5rem; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +} +@media screen and (min-width: 0\0) { + /* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ + select { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); + } +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ +select:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +} +/* line 66, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ +select:disabled { + background-color: #e6e6e6; + cursor: not-allowed; +} +/* line 72, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ +select::-ms-expand { + display: none; +} +/* line 76, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_select.scss */ +select[multiple] { + height: auto; + background-image: none; +} + +/* line 45, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_error.scss */ +.is-invalid-input:not(:focus) { + border-color: #cc4b37; + background-color: #f9ecea; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_error.scss */ +.is-invalid-input:not(:focus)::placeholder { + color: #cc4b37; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_error.scss */ +.is-invalid-label { + color: #cc4b37; +} + +/* line 81, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_error.scss */ +.form-error { + display: none; + margin-top: -0.5rem; + margin-bottom: 1rem; + font-size: 0.75rem; + font-weight: bold; + color: #cc4b37; +} +/* line 84, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/forms/_error.scss */ +.form-error.is-visible { + display: block; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.hide { + display: none !important; +} + +/* line 66, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.invisible { + visibility: hidden; +} + +@media screen and (max-width: 39.9375em) { + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-small-only { + display: none !important; + } +} + +@media screen and (max-width: 0em), screen and (min-width: 40em) { + /* line 86, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-small-only { + display: none !important; + } +} + +@media print, screen and (min-width: 40em) { + /* line 73, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-medium { + display: none !important; + } +} + +@media screen and (max-width: 39.9375em) { + /* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-medium { + display: none !important; + } +} + +@media screen and (min-width: 40em) and (max-width: 63.9375em) { + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-medium-only { + display: none !important; + } +} + +@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { + /* line 86, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-medium-only { + display: none !important; + } +} + +@media print, screen and (min-width: 64em) { + /* line 73, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-large { + display: none !important; + } +} + +@media screen and (max-width: 63.9375em) { + /* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-large { + display: none !important; + } +} + +@media screen and (min-width: 64em) and (max-width: 74.9375em) { + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-large-only { + display: none !important; + } +} + +@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { + /* line 86, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-large-only { + display: none !important; + } +} + +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.show-for-sr, +.show-on-focus { + position: absolute !important; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + clip-path: inset(50%); + border: 0; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.show-on-focus:active, .show-on-focus:focus { + position: static !important; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; + clip-path: none; +} + +/* line 107, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.show-for-landscape, +.hide-for-portrait { + display: block !important; +} +@media screen and (orientation: landscape) { + /* line 107, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-landscape, + .hide-for-portrait { + display: block !important; + } +} +@media screen and (orientation: portrait) { + /* line 107, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .show-for-landscape, + .hide-for-portrait { + display: none !important; + } +} + +/* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ +.hide-for-landscape, +.show-for-portrait { + display: none !important; +} +@media screen and (orientation: landscape) { + /* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-landscape, + .show-for-portrait { + display: none !important; + } +} +@media screen and (orientation: portrait) { + /* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_visibility.scss */ + .hide-for-landscape, + .show-for-portrait { + display: block !important; + } +} + +/* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_float.scss */ +.float-left { + float: left !important; +} + +/* line 14, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_float.scss */ +.float-right { + float: right !important; +} + +/* line 18, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_float.scss */ +.float-center { + display: block; + margin-right: auto; + margin-left: auto; +} + +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.clearfix::before, .clearfix::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.clearfix::after { + clear: both; +} + +/* line 140, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion { + margin-left: 0; + background: #fefefe; + list-style-type: none; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion[disabled] .accordion-title { + cursor: not-allowed; +} + +/* line 65, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-item:first-child > :first-child { + border-radius: 0 0 0 0; +} +/* line 69, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-item:last-child > :last-child { + border-radius: 0 0 0 0; +} + +/* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-title { + position: relative; + display: block; + padding: 1.25rem 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +:last-child:not(.is-active) > .accordion-title { + border-bottom: 1px solid #e6e6e6; + border-radius: 0 0 0 0; +} +/* line 98, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-title:hover, .accordion-title:focus { + background-color: #e6e6e6; +} +/* line 104, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-title::before { + position: absolute; + top: 50%; + right: 1rem; + margin-top: -0.5rem; + content: '+'; +} +/* line 112, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.is-active > .accordion-title::before { + content: '\2013'; +} + +/* line 152, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +.accordion-content { + display: none; + padding: 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #fefefe; + color: #0a0a0a; +} +/* line 134, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion.scss */ +:last-child > .accordion-content:last-child { + border-bottom: 1px solid #e6e6e6; +} + +/* line 81, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu li { + width: 100%; +} +/* line 90, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu a { + padding: 0.7rem 1rem; +} +/* line 97, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu .is-accordion-submenu a { + padding: 0.7rem 1rem; +} +/* line 101, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu .nested.is-accordion-submenu { + margin-right: 0; + margin-left: 1rem; +} +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu.align-right .nested.is-accordion-submenu { + margin-right: 1rem; + margin-left: 0; +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle) > a { + position: relative; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle) > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + position: absolute; + top: 50%; + margin-top: -3px; + right: 1rem; +} +/* line 65, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu.align-left .is-accordion-submenu-parent > a::after { + left: auto; + right: 1rem; +} +/* line 69, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu.align-right .is-accordion-submenu-parent > a::after { + right: auto; + left: 1rem; +} +/* line 114, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.accordion-menu .is-accordion-submenu-parent[aria-expanded='true'] > a::after { + transform: rotate(180deg); + transform-origin: 50% 50%; +} + +/* line 128, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.is-accordion-submenu-parent { + position: relative; +} + +/* line 132, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.has-submenu-toggle > a { + margin-right: 40px; +} + +/* line 137, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.submenu-toggle { + position: absolute; + top: 0; + right: 0; + cursor: pointer; + width: 40px; + height: 40px; +} +/* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.submenu-toggle::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + top: 0; + bottom: 0; + margin: auto; +} + +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.submenu-toggle[aria-expanded='true']::after { + transform: scaleY(-1); + transform-origin: 50% 50%; +} + +/* line 168, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_accordion-menu.scss */ +.submenu-toggle-text { + position: absolute !important; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + clip-path: inset(50%); + border: 0; +} + +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge { + display: inline-block; + min-width: 2.1em; + padding: 0.3em; + border-radius: 50%; + font-size: 0.6rem; + text-align: center; + background: #1779ba; + color: #fefefe; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge.primary { + background: #1779ba; + color: #fefefe; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge.secondary { + background: #767676; + color: #fefefe; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge.success { + background: #3adb76; + color: #0a0a0a; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge.warning { + background: #ffae00; + color: #0a0a0a; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_badge.scss */ +.badge.alert { + background: #cc4b37; + color: #fefefe; +} + +/* line 109, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs { + margin: 0 0 1rem 0; + list-style: none; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.breadcrumbs::before, .breadcrumbs::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.breadcrumbs::after { + clear: both; +} +/* line 70, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs li { + float: left; + font-size: 0.6875rem; + color: #0a0a0a; + cursor: default; + text-transform: uppercase; +} +/* line 85, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs li:not(:last-child)::after { + position: relative; + margin: 0 0.75rem; + opacity: 1; + content: "/"; + color: #cacaca; +} +/* line 99, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs a { + color: #1779ba; +} +/* line 102, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs a:hover { + text-decoration: underline; +} +/* line 112, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_breadcrumbs.scss */ +.breadcrumbs .disabled { + color: #cacaca; + cursor: not-allowed; +} + +/* line 196, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group { + margin-bottom: 1rem; + display: flex; + flex-wrap: nowrap; + align-items: stretch; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.button-group::before, .button-group::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.button-group::after { + clear: both; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group .button { + margin: 0; + margin-right: 1px; + margin-bottom: 1px; + font-size: 0.9rem; + flex: 0 0 auto; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group .button:last-child { + margin-right: 0; +} +/* line 201, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.tiny .button { + font-size: 0.6rem; +} +/* line 201, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.small .button { + font-size: 0.75rem; +} +/* line 201, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.large .button { + font-size: 1.25rem; +} +/* line 96, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.expanded .button { + flex: 1 1 0px; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.primary .button { + background-color: #1779ba; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button-group.primary .button:hover, .button-group.primary .button:focus { + background-color: #126195; + color: #fefefe; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.secondary .button { + background-color: #767676; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button-group.secondary .button:hover, .button-group.secondary .button:focus { + background-color: #5e5e5e; + color: #fefefe; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.success .button { + background-color: #3adb76; + color: #0a0a0a; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button-group.success .button:hover, .button-group.success .button:focus { + background-color: #22bb5b; + color: #0a0a0a; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.warning .button { + background-color: #ffae00; + color: #0a0a0a; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button-group.warning .button:hover, .button-group.warning .button:focus { + background-color: #cc8b00; + color: #0a0a0a; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.alert .button { + background-color: #cc4b37; + color: #fefefe; +} +/* line 150, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button.scss */ +.button-group.alert .button:hover, .button-group.alert .button:focus { + background-color: #a53b2a; + color: #fefefe; +} +/* line 224, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.stacked, .button-group.stacked-for-small, .button-group.stacked-for-medium { + flex-wrap: wrap; +} +/* line 133, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { + flex: 0 0 100%; +} +/* line 141, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ +.button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child { + margin-bottom: 0; +} +@media print, screen and (min-width: 40em) { + /* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ + .button-group.stacked-for-small .button { + flex: 1 1 0px; + margin-bottom: 0; + } +} +@media print, screen and (min-width: 64em) { + /* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ + .button-group.stacked-for-medium .button { + flex: 1 1 0px; + margin-bottom: 0; + } +} +@media screen and (max-width: 39.9375em) { + /* line 242, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ + .button-group.stacked-for-small.expanded { + display: block; + } + /* line 246, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_button-group.scss */ + .button-group.stacked-for-small.expanded .button { + display: block; + margin-right: 0; + } +} + +/* line 89, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout { + position: relative; + margin: 0 0 1rem 0; + padding: 1rem; + border: 1px solid rgba(10, 10, 10, 0.25); + border-radius: 0; + background-color: white; + color: #0a0a0a; +} +/* line 55, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout > :first-child { + margin-top: 0; +} +/* line 59, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout > :last-child { + margin-bottom: 0; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.primary { + background-color: #d7ecfa; + color: #0a0a0a; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.secondary { + background-color: #eaeaea; + color: #0a0a0a; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.success { + background-color: #e1faea; + color: #0a0a0a; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.warning { + background-color: #fff3d9; + color: #0a0a0a; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.alert { + background-color: #f7e4e1; + color: #0a0a0a; +} +/* line 98, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.small { + padding-top: 0.5rem; + padding-right: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.5rem; +} +/* line 102, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_callout.scss */ +.callout.large { + padding-top: 3rem; + padding-right: 3rem; + padding-bottom: 3rem; + padding-left: 3rem; +} + +/* line 112, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card { + display: flex; + flex-direction: column; + flex-grow: 1; + margin-bottom: 1rem; + border: 1px solid #e6e6e6; + border-radius: 0; + background: #fefefe; + box-shadow: none; + overflow: hidden; + color: #0a0a0a; +} +/* line 73, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card > :last-child { + margin-bottom: 0; +} + +/* line 116, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card-divider { + flex: 0 1 auto; + display: flex; + padding: 1rem; + background: #e6e6e6; +} +/* line 91, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card-divider > :last-child { + margin-bottom: 0; +} + +/* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card-section { + flex: 1 0 auto; + padding: 1rem; +} +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card-section > :last-child { + margin-bottom: 0; +} + +/* line 126, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_card.scss */ +.card-image { + min-height: 1px; +} + +/* line 96, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_close-button.scss */ +.close-button { + position: absolute; + color: #8a8a8a; + cursor: pointer; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .close-button { + outline: 0; +} +/* line 89, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_close-button.scss */ +.close-button:hover, .close-button:focus { + color: #0a0a0a; +} +/* line 99, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_close-button.scss */ +.close-button.small { + right: 0.66rem; + top: 0.33em; + font-size: 1.5em; + line-height: 1; +} +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_close-button.scss */ +.close-button, .close-button.medium { + right: 1rem; + top: 0.5rem; + font-size: 2em; + line-height: 1; +} + +/* line 73, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.is-drilldown { + position: relative; + overflow: hidden; +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.is-drilldown li { + display: block; +} +/* line 81, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.is-drilldown.animate-height { + transition: height 0.5s; +} + +/* line 88, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown a { + padding: 0.7rem 1rem; + background: #fefefe; +} +/* line 94, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: -1; + width: 100%; + background: #fefefe; + transition: transform 0.15s linear; +} +/* line 104, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu.is-active { + z-index: 1; + display: block; + transform: translateX(-100%); +} +/* line 110, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu.is-closing { + transform: translateX(100%); +} +/* line 115, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu a { + padding: 0.7rem 1rem; +} +/* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .nested.is-drilldown-submenu { + margin-right: 0; + margin-left: 0; +} +/* line 124, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .drilldown-submenu-cover-previous { + min-height: 100%; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu-parent > a { + position: relative; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .is-drilldown-submenu-parent > a::after { + position: absolute; + top: 50%; + margin-top: -6px; + right: 1rem; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; +} +/* line 57, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown.align-left .is-drilldown-submenu-parent > a::after { + left: auto; + right: 1rem; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; +} +/* line 63, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown.align-right .is-drilldown-submenu-parent > a::after { + right: auto; + left: 1rem; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; +} +/* line 131, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_drilldown.scss */ +.drilldown .js-drilldown-back > a::before { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; + border-left-width: 0; + display: inline-block; + vertical-align: middle; + margin-right: 0.75rem; + border-left-width: 0; +} + +/* line 70, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane { + position: absolute; + z-index: 10; + width: 300px; + padding: 1rem; + visibility: hidden; + display: none; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-size: 1rem; +} +/* line 59, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane.is-opening { + display: block; +} +/* line 63, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane.is-open { + visibility: visible; + display: block; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane.tiny { + width: 100px; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane.small { + width: 200px; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown.scss */ +.dropdown-pane.large { + width: 400px; +} + +/* line 85, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; +} +/* line 101, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; +} +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; +} +/* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu a { + padding: 0.7rem 1rem; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .dropdown.menu a { + outline: 0; +} +/* line 154, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu .is-active > a { + background: transparent; + color: #1779ba; +} +/* line 159, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.no-js .dropdown.menu ul { + display: none; +} +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu .nested.is-dropdown-submenu { + margin-right: 0; + margin-left: 0; +} +/* line 115, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li .is-dropdown-submenu { + top: 0; +} +/* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; + top: 0; +} +/* line 128, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li > a::after { + right: 14px; +} +/* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li.opens-left > a::after { + right: auto; + left: 5px; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; +} +@media print, screen and (min-width: 40em) { + /* line 85, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; + } + /* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; + } + /* line 101, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; + } + /* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; + } + /* line 115, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li .is-dropdown-submenu { + top: 0; + } + /* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; + top: 0; + } + /* line 128, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; + } + /* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li > a::after { + right: 14px; + } + /* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li.opens-left > a::after { + right: auto; + left: 5px; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; + } + /* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.medium-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; + } +} +@media print, screen and (min-width: 64em) { + /* line 85, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; + } + /* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; + } + /* line 101, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; + } + /* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; + } + /* line 115, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li .is-dropdown-submenu { + top: 0; + } + /* line 120, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; + top: 0; + } + /* line 128, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; + } + /* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li > a::after { + right: 14px; + } + /* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li.opens-left > a::after { + right: auto; + left: 5px; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; + } + /* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ + .dropdown.menu.large-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; + } +} +/* line 186, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown.menu.align-right .is-dropdown-submenu.first-sub { + top: 100%; + right: 0; + left: auto; +} + +/* line 194, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-menu.vertical { + width: 100px; +} +/* line 197, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-menu.vertical.align-right { + float: right; +} + +/* line 202, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu-parent { + position: relative; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu-parent a::after { + position: absolute; + top: 50%; + right: 5px; + margin-top: -6px; +} +/* line 212, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { + top: 100%; + left: auto; +} +/* line 223, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; +} +/* line 228, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; +} + +/* line 234, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: 1; + display: none; + min-width: 200px; + border: 1px solid #cacaca; + background: #fefefe; +} +/* line 246, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.dropdown .is-dropdown-submenu a { + padding: 0.7rem 1rem; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu .is-dropdown-submenu-parent > a::after { + right: 14px; +} +/* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { + right: auto; + left: 5px; + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; +} +/* line 257, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu .is-dropdown-submenu { + margin-top: -1px; +} +/* line 262, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu > li { + width: 100%; +} +/* line 268, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_dropdown-menu.scss */ +.is-dropdown-submenu.js-dropdown-active { + display: block; +} + +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_responsive-embed.scss */ +.responsive-embed, +.flex-video { + position: relative; + height: 0; + margin-bottom: 1rem; + padding-bottom: 75%; + overflow: hidden; +} +/* line 35, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_responsive-embed.scss */ +.responsive-embed iframe, +.responsive-embed object, +.responsive-embed embed, +.responsive-embed video, +.flex-video iframe, +.flex-video object, +.flex-video embed, +.flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +/* line 55, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_responsive-embed.scss */ +.responsive-embed.widescreen, +.flex-video.widescreen { + padding-bottom: 56.25%; +} + +/* line 51, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label { + display: inline-block; + padding: 0.33333rem 0.5rem; + border-radius: 0; + font-size: 0.8rem; + line-height: 1; + white-space: nowrap; + cursor: default; + background: #1779ba; + color: #fefefe; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label.primary { + background: #1779ba; + color: #fefefe; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label.secondary { + background: #767676; + color: #fefefe; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label.success { + background: #3adb76; + color: #0a0a0a; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label.warning { + background: #ffae00; + color: #0a0a0a; +} +/* line 58, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_label.scss */ +.label.alert { + background: #cc4b37; + color: #fefefe; +} + +/* line 74, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object { + display: flex; + margin-bottom: 1rem; + flex-wrap: nowrap; +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object img { + max-width: none; +} +@media screen and (max-width: 39.9375em) { + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ + .media-object.stack-for-small { + flex-wrap: wrap; + } +} +@media screen and (max-width: 39.9375em) { + /* line 89, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ + .media-object.stack-for-small .media-object-section { + padding: 0; + padding-bottom: 1rem; + flex-basis: 100%; + max-width: 100%; + } + /* line 68, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ + .media-object.stack-for-small .media-object-section img { + width: 100%; + } +} + +/* line 96, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object-section { + flex: 0 1 auto; +} +/* line 42, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object-section:first-child { + padding-right: 1rem; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object-section:last-child:not(:nth-child(2)) { + padding-left: 1rem; +} +/* line 50, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object-section > :last-child { + margin-bottom: 0; +} +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_media-object.scss */ +.media-object-section.main-section { + flex: 1 1 0px; +} + +/* line 357, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu { + padding: 0; + margin: 0; + list-style: none; + position: relative; + display: flex; + flex-wrap: wrap; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .menu li { + outline: 0; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu a, +.menu .button { + line-height: 1; + text-decoration: none; + white-space: nowrap; + display: block; + padding: 0.7rem 1rem; +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu input, +.menu select, +.menu a, +.menu button { + margin-bottom: 0; +} +/* line 84, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu input { + display: inline-block; +} +/* line 361, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu, .menu.horizontal { + flex-wrap: wrap; + flex-direction: row; +} +/* line 366, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.vertical { + flex-wrap: nowrap; + flex-direction: column; +} +/* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.expanded li { + flex: 1 1 0px; +} +/* line 376, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.simple { + align-items: center; +} +/* line 210, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.simple li + li { + margin-left: 1rem; +} +/* line 214, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.simple a { + padding: 0; +} +@media print, screen and (min-width: 40em) { + /* line 382, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.medium-horizontal { + flex-wrap: wrap; + flex-direction: row; + } + /* line 386, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.medium-vertical { + flex-wrap: nowrap; + flex-direction: column; + } + /* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.medium-expanded li { + flex: 1 1 0px; + } + /* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.medium-simple li { + flex: 1 1 0px; + } +} +@media print, screen and (min-width: 64em) { + /* line 382, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.large-horizontal { + flex-wrap: wrap; + flex-direction: row; + } + /* line 386, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.large-vertical { + flex-wrap: nowrap; + flex-direction: column; + } + /* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.large-expanded li { + flex: 1 1 0px; + } + /* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ + .menu.large-simple li { + flex: 1 1 0px; + } +} +/* line 400, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.nested { + margin-right: 0; + margin-left: 1rem; +} +/* line 240, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icons a { + display: flex; +} +/* line 260, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-left li a { + flex-flow: row nowrap; +} +/* line 265, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-left li a img, +.menu.icon-left li a i, +.menu.icon-left li a svg { + margin-right: 0.25rem; +} +/* line 277, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-right li a { + flex-flow: row nowrap; +} +/* line 282, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-right li a img, +.menu.icon-right li a i, +.menu.icon-right li a svg { + margin-left: 0.25rem; +} +/* line 294, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-top li a { + flex-flow: column nowrap; +} +/* line 302, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-top li a img, +.menu.icon-top li a i, +.menu.icon-top li a svg { + align-self: stretch; + margin-bottom: 0.25rem; + text-align: center; +} +/* line 318, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-bottom li a { + flex-flow: column nowrap; +} +/* line 326, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.icon-bottom li a img, +.menu.icon-bottom li a i, +.menu.icon-bottom li a svg { + align-self: stretch; + margin-bottom: 0.25rem; + text-align: center; +} +/* line 430, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu .is-active > a { + background: #1779ba; + color: #fefefe; +} +/* line 436, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu .active > a { + background: #1779ba; + color: #fefefe; +} +/* line 442, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-left { + justify-content: flex-start; +} +/* line 119, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-right li { + display: flex; + justify-content: flex-end; +} +/* line 123, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-right li .submenu li { + justify-content: flex-start; +} +/* line 128, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-right.vertical li { + display: block; + text-align: right; +} +/* line 132, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-right.vertical li .submenu li { + text-align: right; +} +/* line 450, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-right .nested { + margin-right: 1rem; + margin-left: 0; +} +/* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-center li { + display: flex; + justify-content: center; +} +/* line 157, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu.align-center li .submenu li { + justify-content: flex-start; +} +/* line 460, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu .menu-text { + padding: 0.7rem 1rem; + font-weight: bold; + line-height: 1; + color: inherit; +} + +/* line 467, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu-centered > .menu { + justify-content: center; +} +/* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu-centered > .menu li { + display: flex; + justify-content: center; +} +/* line 157, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.menu-centered > .menu li .submenu li { + justify-content: flex-start; +} + +/* line 478, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu.scss */ +.no-js [data-responsive-menu] ul { + display: none; +} + +/* line 2, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu-icon.scss */ +.menu-icon { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; +} +/* line 117, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.menu-icon::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #fefefe; + box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; + content: ''; +} +/* line 140, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.menu-icon:hover::after { + background: #cacaca; + box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; +} + +/* line 6, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_menu-icon.scss */ +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; +} +/* line 117, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.menu-icon.dark::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #0a0a0a; + box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; + content: ''; +} +/* line 140, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.menu-icon.dark:hover::after { + background: #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; +} + +/* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.is-off-canvas-open { + overflow: hidden; +} + +/* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.js-off-canvas-overlay { + position: absolute; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + transition: opacity 0.5s ease, visibility 0.5s ease; + background: rgba(254, 254, 254, 0.25); + opacity: 0; + visibility: hidden; + overflow: hidden; +} +/* line 101, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.js-off-canvas-overlay.is-visible { + opacity: 1; + visibility: visible; +} +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.js-off-canvas-overlay.is-closable { + cursor: pointer; +} +/* line 110, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.js-off-canvas-overlay.is-overlay-absolute { + position: absolute; +} +/* line 114, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.js-off-canvas-overlay.is-overlay-fixed { + position: fixed; +} + +/* line 379, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-wrapper { + position: relative; + overflow: hidden; +} + +/* line 384, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas { + position: fixed; + z-index: 12; + transition: transform 0.5s ease; + backface-visibility: hidden; + background: #e6e6e6; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .off-canvas { + outline: 0; +} +/* line 145, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas.is-transition-push { + z-index: 12; +} +/* line 155, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas.is-closed { + visibility: hidden; +} +/* line 160, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas.is-transition-overlap { + z-index: 13; +} +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); +} +/* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas.is-open { + transform: translate(0, 0); +} + +/* line 395, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute { + position: absolute; + z-index: 12; + transition: transform 0.5s ease; + backface-visibility: hidden; + background: #e6e6e6; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .off-canvas-absolute { + outline: 0; +} +/* line 145, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute.is-transition-push { + z-index: 12; +} +/* line 155, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute.is-closed { + visibility: hidden; +} +/* line 160, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute.is-transition-overlap { + z-index: 13; +} +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); +} +/* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-absolute.is-open { + transform: translate(0, 0); +} + +/* line 400, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-left { + top: 0; + left: 0; + width: 250px; + height: 100%; + transform: translateX(-250px); + overflow-y: auto; +} +/* line 190, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-left { + transform: translateX(-250px); +} +/* line 192, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open { + transform: translate(0, 0); +} +/* line 199, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content.is-open-left.has-transition-push { + transform: translateX(250px); +} +/* line 282, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-left.is-transition-push { + box-shadow: inset -13px 0 20px -13px rgba(10, 10, 10, 0.25); +} + +/* line 401, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-right { + top: 0; + right: 0; + width: 250px; + height: 100%; + transform: translateX(250px); + overflow-y: auto; +} +/* line 214, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-right { + transform: translateX(250px); +} +/* line 216, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open { + transform: translate(0, 0); +} +/* line 223, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content.is-open-right.has-transition-push { + transform: translateX(-250px); +} +/* line 282, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-right.is-transition-push { + box-shadow: inset 13px 0 20px -13px rgba(10, 10, 10, 0.25); +} + +/* line 402, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-top { + top: 0; + left: 0; + width: 100%; + height: 250px; + transform: translateY(-250px); + overflow-x: auto; +} +/* line 239, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-top { + transform: translateY(-250px); +} +/* line 241, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open { + transform: translate(0, 0); +} +/* line 248, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content.is-open-top.has-transition-push { + transform: translateY(250px); +} +/* line 282, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-top.is-transition-push { + box-shadow: inset 0 -13px 20px -13px rgba(10, 10, 10, 0.25); +} + +/* line 403, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-bottom { + bottom: 0; + left: 0; + width: 100%; + height: 250px; + transform: translateY(250px); + overflow-x: auto; +} +/* line 264, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-bottom { + transform: translateY(250px); +} +/* line 266, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open { + transform: translate(0, 0); +} +/* line 273, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content.is-open-bottom.has-transition-push { + transform: translateY(-250px); +} +/* line 282, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.position-bottom.is-transition-push { + box-shadow: inset 0 13px 20px -13px rgba(10, 10, 10, 0.25); +} + +/* line 405, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content { + transform: none; + transition: transform 0.5s ease; + backface-visibility: hidden; +} +/* line 307, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content.has-transition-push { + transform: translate(0, 0); +} +/* line 312, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ +.off-canvas-content .off-canvas.is-open { + transform: translate(0, 0); +} + +@media print, screen and (min-width: 40em) { + /* line 413, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-medium { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-medium .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-left.reveal-for-medium { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-left { + margin-left: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-medium ~ .off-canvas-content { + margin-left: 250px; + } + + /* line 417, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-medium { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-medium .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-right.reveal-for-medium { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-right { + margin-right: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-medium ~ .off-canvas-content { + margin-right: 250px; + } + + /* line 421, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-medium { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-medium .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-top.reveal-for-medium { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-top { + margin-top: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-medium ~ .off-canvas-content { + margin-top: 250px; + } + + /* line 425, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-medium { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-medium .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-bottom.reveal-for-medium { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-bottom { + margin-bottom: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-medium ~ .off-canvas-content { + margin-bottom: 250px; + } +} +@media print, screen and (min-width: 64em) { + /* line 413, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-large { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-large .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-left.reveal-for-large { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-left { + margin-left: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-left.reveal-for-large ~ .off-canvas-content { + margin-left: 250px; + } + + /* line 417, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-large { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-large .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-right.reveal-for-large { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-right { + margin-right: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-right.reveal-for-large ~ .off-canvas-content { + margin-right: 250px; + } + + /* line 421, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-large { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-large .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-top.reveal-for-large { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-top { + margin-top: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-top.reveal-for-large ~ .off-canvas-content { + margin-top: 250px; + } + + /* line 425, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-large { + transform: none; + z-index: 12; + transition: none; + visibility: visible; + } + /* line 332, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-large .close-button { + display: none; + } + /* line 337, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content .position-bottom.reveal-for-large { + transform: none; + } + /* line 341, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas-content.has-reveal-bottom { + margin-bottom: 250px; + } + /* line 346, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .position-bottom.reveal-for-large ~ .off-canvas-content { + margin-bottom: 250px; + } +} +@media print, screen and (min-width: 40em) { + /* line 436, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-medium { + visibility: visible; + height: auto; + position: static; + background: inherit; + width: inherit; + overflow: inherit; + transition: inherit; + } + /* line 362, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-medium.position-left, .off-canvas.in-canvas-for-medium.position-right, .off-canvas.in-canvas-for-medium.position-top, .off-canvas.in-canvas-for-medium.position-bottom { + box-shadow: none; + transform: none; + } + /* line 370, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-medium .close-button { + display: none; + } +} +@media print, screen and (min-width: 64em) { + /* line 436, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-large { + visibility: visible; + height: auto; + position: static; + background: inherit; + width: inherit; + overflow: inherit; + transition: inherit; + } + /* line 362, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-large.position-left, .off-canvas.in-canvas-for-large.position-right, .off-canvas.in-canvas-for-large.position-top, .off-canvas.in-canvas-for-large.position-bottom { + box-shadow: none; + transform: none; + } + /* line 370, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_off-canvas.scss */ + .off-canvas.in-canvas-for-large .close-button { + display: none; + } +} +/* line 155, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit { + position: relative; +} + +/* line 159, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-container { + position: relative; + height: 0; + margin: 0; + list-style: none; + overflow: hidden; +} + +/* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-slide { + width: 100%; +} +/* line 72, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-slide.no-motionui.is-active { + top: 0; + left: 0; +} + +/* line 167, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-figure { + margin: 0; +} + +/* line 171, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-image { + width: 100%; + max-width: 100%; + margin: 0; +} + +/* line 175, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-caption { + position: absolute; + bottom: 0; + width: 100%; + margin-bottom: 0; + padding: 1rem; + background-color: rgba(10, 10, 10, 0.5); + color: #fefefe; +} + +/* line 179, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-previous, .orbit-next { + position: absolute; + top: 50%; + transform: translateY(-50%); + z-index: 10; + padding: 1rem; + color: #fefefe; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { + outline: 0; +} +/* line 110, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { + background-color: rgba(10, 10, 10, 0.5); +} + +/* line 183, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-previous { + left: 0; +} + +/* line 188, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-next { + left: auto; + right: 0; +} + +/* line 193, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-bullets { + position: relative; + margin-top: 0.8rem; + margin-bottom: 0.8rem; + text-align: center; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .orbit-bullets { + outline: 0; +} +/* line 136, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-bullets button { + width: 1.2rem; + height: 1.2rem; + margin: 0.1rem; + border-radius: 50%; + background-color: #cacaca; +} +/* line 144, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-bullets button:hover { + background-color: #8a8a8a; +} +/* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_orbit.scss */ +.orbit-bullets button.is-active { + background-color: #8a8a8a; +} + +/* line 162, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination { + margin-left: 0; + margin-bottom: 1rem; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.pagination::before, .pagination::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.pagination::after { + clear: both; +} +/* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination li { + margin-right: 0.0625rem; + border-radius: 0; + font-size: 0.875rem; + display: none; +} +/* line 94, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination li:last-child, .pagination li:first-child { + display: inline-block; +} +@media print, screen and (min-width: 40em) { + /* line 83, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ + .pagination li { + display: inline-block; + } +} +/* line 112, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination a, +.pagination button { + display: block; + padding: 0.1875rem 0.625rem; + border-radius: 0; + color: #0a0a0a; +} +/* line 119, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination a:hover, +.pagination button:hover { + background: #e6e6e6; +} +/* line 165, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination .current { + padding: 0.1875rem 0.625rem; + background: #1779ba; + color: #fefefe; + cursor: default; +} +/* line 169, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination .disabled { + padding: 0.1875rem 0.625rem; + color: #cacaca; + cursor: not-allowed; +} +/* line 146, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination .disabled:hover { + background: transparent; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination .ellipsis::after { + padding: 0.1875rem 0.625rem; + content: '\2026'; + color: #0a0a0a; +} + +/* line 179, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination-previous a::before, +.pagination-previous.disabled::before { + display: inline-block; + margin-right: 0.5rem; + content: '\00ab'; +} + +/* line 186, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_pagination.scss */ +.pagination-next a::after, +.pagination-next.disabled::after { + display: inline-block; + margin-left: 0.5rem; + content: '\00bb'; +} + +/* line 43, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress { + height: 1rem; + margin-bottom: 1rem; + border-radius: 0; + background-color: #cacaca; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress.primary .progress-meter { + background-color: #1779ba; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress.secondary .progress-meter { + background-color: #767676; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress.success .progress-meter { + background-color: #3adb76; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress.warning .progress-meter { + background-color: #ffae00; +} +/* line 48, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress.alert .progress-meter { + background-color: #cc4b37; +} + +/* line 56, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress-meter { + position: relative; + display: block; + width: 0%; + height: 100%; + background-color: #1779ba; +} + +/* line 61, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_progress-bar.scss */ +.progress-meter-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + position: absolute; + margin: 0; + font-size: 0.75rem; + font-weight: bold; + color: #fefefe; + white-space: nowrap; +} + +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider { + position: relative; + height: 0.5rem; + margin-top: 1.25rem; + margin-bottom: 2.25rem; + background-color: #e6e6e6; + cursor: pointer; + user-select: none; + touch-action: none; +} + +/* line 111, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider-fill { + position: absolute; + top: 0; + left: 0; + display: inline-block; + max-width: 100%; + height: 0.5rem; + background-color: #cacaca; + transition: all 0.2s ease-in-out; +} +/* line 46, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider-fill.is-dragging { + transition: all 0s linear; +} + +/* line 116, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider-handle { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 0; + z-index: 1; + display: inline-block; + width: 1.4rem; + height: 1.4rem; + border-radius: 0; + background-color: #1779ba; + transition: all 0.2s ease-in-out; + touch-action: manipulation; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .slider-handle { + outline: 0; +} +/* line 67, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider-handle:hover { + background-color: #14679e; +} +/* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider-handle.is-dragging { + transition: all 0s linear; +} + +/* line 121, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider.disabled, +.slider[disabled] { + opacity: 0.25; + cursor: not-allowed; +} + +/* line 127, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider.vertical { + display: inline-block; + width: 0.5rem; + height: 12.5rem; + margin: 0 1.25rem; + transform: scale(1, -1); +} +/* line 88, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider.vertical .slider-fill { + top: 0; + width: 0.5rem; + max-height: 100%; +} +/* line 94, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_slider.scss */ +.slider.vertical .slider-handle { + position: absolute; + top: 0; + left: 50%; + width: 1.4rem; + height: 1.4rem; + transform: translateX(-50%); +} + +/* line 6, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky-container { + position: relative; +} + +/* line 10, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky { + position: relative; + z-index: 0; + transform: translate3d(0, 0, 0); +} + +/* line 16, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky.is-stuck { + position: fixed; + z-index: 5; + width: 100%; +} +/* line 21, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky.is-stuck.is-at-top { + top: 0; +} +/* line 25, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky.is-stuck.is-at-bottom { + bottom: 0; +} + +/* line 30, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky.is-anchored { + position: relative; + right: auto; + left: auto; +} +/* line 35, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_sticky.scss */ +.sticky.is-anchored.is-at-bottom { + bottom: 0; +} + +/* line 129, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +body.is-reveal-open { + overflow: hidden; +} + +/* line 134, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +html.is-reveal-open, +html.is-reveal-open body { + min-height: 100%; + overflow: hidden; + position: fixed; + user-select: none; +} + +/* line 143, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1005; + display: none; + background-color: rgba(10, 10, 10, 0.45); + overflow-y: scroll; +} + +/* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal { + z-index: 1006; + backface-visibility: hidden; + display: none; + padding: 1rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + position: relative; + top: 100px; + margin-right: auto; + margin-left: auto; + overflow-y: auto; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] .reveal { + outline: 0; +} +@media print, screen and (min-width: 40em) { + /* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal { + min-height: 0; + } +} +/* line 87, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal .column, .reveal .columns { + min-width: 0; +} +/* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal > :last-child { + margin-bottom: 0; +} +@media print, screen and (min-width: 40em) { + /* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal { + width: 600px; + max-width: 75rem; + } +} +/* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal.collapse { + padding: 0; +} +@media print, screen and (min-width: 40em) { + /* line 163, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal.tiny { + width: 30%; + max-width: 75rem; + } +} +@media print, screen and (min-width: 40em) { + /* line 164, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal.small { + width: 50%; + max-width: 75rem; + } +} +@media print, screen and (min-width: 40em) { + /* line 165, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal.large { + width: 90%; + max-width: 75rem; + } +} +/* line 168, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal.full { + top: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + height: 100vh; + min-height: 100vh; + margin-left: 0; + border: 0; + border-radius: 0; +} +@media screen and (max-width: 39.9375em) { + /* line 148, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ + .reveal { + top: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + height: 100vh; + min-height: 100vh; + margin-left: 0; + border: 0; + border-radius: 0; + } +} +/* line 176, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_reveal.scss */ +.reveal.without-overlay { + position: fixed; +} + +/* line 203, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch { + height: 2rem; + position: relative; + margin-bottom: 1rem; + outline: 0; + font-size: 0.875rem; + font-weight: bold; + color: #fefefe; + user-select: none; +} + +/* line 209, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-input { + position: absolute; + margin-bottom: 0; + opacity: 0; +} + +/* line 214, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-paddle { + position: relative; + display: block; + width: 4rem; + height: 2rem; + border-radius: 0; + background: #cacaca; + transition: all 0.25s ease-out; + font-weight: inherit; + color: inherit; + cursor: pointer; +} +/* line 105, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +input + .switch-paddle { + margin: 0; +} +/* line 110, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-paddle::after { + position: absolute; + top: 0.25rem; + left: 0.25rem; + display: block; + width: 1.5rem; + height: 1.5rem; + transform: translate3d(0, 0, 0); + border-radius: 0; + background: #fefefe; + transition: all 0.25s ease-out; + content: ''; +} +/* line 127, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +input:checked ~ .switch-paddle { + background: #1779ba; +} +/* line 130, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +input:checked ~ .switch-paddle::after { + left: 2.25rem; +} +/* line 205, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +[data-whatinput='mouse'] input:focus ~ .switch-paddle { + outline: 0; +} + +/* line 219, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-active, .switch-inactive { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +/* line 224, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-active { + left: 8%; + display: none; +} +/* line 152, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +input:checked + label > .switch-active { + display: block; +} + +/* line 230, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch-inactive { + right: 15%; +} +/* line 161, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +input:checked + label > .switch-inactive { + display: none; +} + +/* line 236, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.tiny { + height: 1.5rem; +} +/* line 183, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.tiny .switch-paddle { + width: 3rem; + height: 1.5rem; + font-size: 0.625rem; +} +/* line 189, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.tiny .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1rem; + height: 1rem; +} +/* line 196, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.tiny input:checked ~ .switch-paddle::after { + left: 1.75rem; +} + +/* line 240, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.small { + height: 1.75rem; +} +/* line 183, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.small .switch-paddle { + width: 3.5rem; + height: 1.75rem; + font-size: 0.75rem; +} +/* line 189, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.small .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1.25rem; + height: 1.25rem; +} +/* line 196, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.small input:checked ~ .switch-paddle::after { + left: 2rem; +} + +/* line 244, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.large { + height: 2.5rem; +} +/* line 183, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.large .switch-paddle { + width: 5rem; + height: 2.5rem; + font-size: 1rem; +} +/* line 189, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.large .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 2rem; + height: 2rem; +} +/* line 196, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_switch.scss */ +.switch.large input:checked ~ .switch-paddle::after { + left: 2.75rem; +} + +/* line 305, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table { + border-collapse: collapse; + width: 100%; + margin-bottom: 1rem; + border-radius: 0; +} +/* line 111, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +thead, +tbody, +tfoot { + border: 1px solid #f1f1f1; + background-color: #fefefe; +} + +/* line 119, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +caption { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; +} + +/* line 125, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +thead { + background: #f8f8f8; + color: #0a0a0a; +} + +/* line 131, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +tfoot { + background: #f1f1f1; + color: #0a0a0a; +} + +/* line 140, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +thead tr, +tfoot tr { + background: transparent; +} +/* line 145, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +thead th, +thead td, +tfoot th, +tfoot td { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; + text-align: left; +} + +/* line 155, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +tbody th, +tbody td { + padding: 0.5rem 0.625rem 0.625rem; +} + +/* line 87, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +tbody tr:nth-child(even) { + border-bottom: 0; + background-color: #f1f1f1; +} + +/* line 168, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.unstriped tbody { + background-color: #fefefe; +} +/* line 103, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.unstriped tbody tr { + border-bottom: 0; + border-bottom: 1px solid #f1f1f1; + background-color: #fefefe; +} + +@media screen and (max-width: 63.9375em) { + /* line 284, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ + table.stack thead { + display: none; + } + /* line 289, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ + table.stack tfoot { + display: none; + } + /* line 293, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ + table.stack tr, + table.stack th, + table.stack td { + display: block; + } + /* line 299, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ + table.stack td { + border-top: 0; + } +} + +/* line 315, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.scroll { + display: block; + width: 100%; + overflow-x: auto; +} + +/* line 221, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.hover thead tr:hover { + background-color: #f3f3f3; +} +/* line 228, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.hover tfoot tr:hover { + background-color: #ececec; +} +/* line 235, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.hover tbody tr:hover { + background-color: #f9f9f9; +} +/* line 243, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +table.hover:not(.unstriped) tr:nth-of-type(even):hover { + background-color: #ececec; +} + +/* line 323, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +.table-scroll { + overflow-x: auto; +} +/* line 326, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_table.scss */ +.table-scroll table { + width: auto; +} + +/* line 147, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs { + margin: 0; + border: 1px solid #e6e6e6; + background: #fefefe; + list-style-type: none; +} +/* line 173, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.tabs::before, .tabs::after { + display: table; + content: ' '; + flex-basis: 0; + order: 1; +} +/* line 184, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/util/_mixins.scss */ +.tabs::after { + clear: both; +} + +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.vertical > li { + display: block; + float: none; + width: auto; +} + +/* line 158, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.simple > li > a { + padding: 0; +} +/* line 161, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.simple > li > a:hover { + background: transparent; +} + +/* line 168, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.primary { + background: #1779ba; +} +/* line 171, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.primary > li > a { + color: #fefefe; +} +/* line 174, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs.primary > li > a:hover, .tabs.primary > li > a:focus { + background: #1673b1; +} + +/* line 181, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-title { + float: left; +} +/* line 93, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-title > a { + display: block; + padding: 1.25rem 1.5rem; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; +} +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-title > a:hover { + background: #fefefe; + color: #1468a0; +} +/* line 105, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { + background: #e6e6e6; + color: #1779ba; +} + +/* line 185, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-content { + border: 1px solid #e6e6e6; + border-top: 0; + background: #fefefe; + color: #0a0a0a; + transition: all 0.5s ease; +} + +/* line 189, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-content.vertical { + border: 1px solid #e6e6e6; + border-left: 0; +} + +/* line 193, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-panel { + display: none; + padding: 1rem; +} +/* line 141, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tabs.scss */ +.tabs-panel.is-active { + display: block; +} + +/* line 60, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_thumbnail.scss */ +.thumbnail { + display: inline-block; + max-width: 100%; + margin-bottom: 1rem; + border: solid 4px #fefefe; + border-radius: 0; + box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + line-height: 0; +} + +/* line 64, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_thumbnail.scss */ +a.thumbnail { + transition: box-shadow 200ms ease-out; +} +/* line 49, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_thumbnail.scss */ +a.thumbnail:hover, a.thumbnail:focus { + box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); +} +/* line 54, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_thumbnail.scss */ +a.thumbnail image { + box-shadow: none; +} + +/* line 38, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_title-bar.scss */ +.title-bar { + padding: 0.5rem; + background: #0a0a0a; + color: #fefefe; + display: flex; + justify-content: flex-start; + align-items: center; +} +/* line 52, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_title-bar.scss */ +.title-bar .menu-icon { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +/* line 59, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_title-bar.scss */ +.title-bar-left, +.title-bar-right { + flex: 1 1 0px; +} + +/* line 64, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_title-bar.scss */ +.title-bar-right { + text-align: right; +} + +/* line 79, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_title-bar.scss */ +.title-bar-title { + display: inline-block; + vertical-align: middle; + font-weight: bold; +} + +/* line 153, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.has-tip { + position: relative; + display: inline-block; + border-bottom: dotted 1px #8a8a8a; + font-weight: bold; + cursor: help; +} + +/* line 157, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip { + position: absolute; + top: calc(100% + 0.6495rem); + z-index: 1200; + max-width: 10rem; + padding: 0.75rem; + border-radius: 0; + background-color: #0a0a0a; + font-size: 80%; + color: #fefefe; +} +/* line 75, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip::before { + position: absolute; +} +/* line 80, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.bottom::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-top-width: 0; + border-bottom-style: solid; + border-color: transparent transparent #0a0a0a; + bottom: 100%; +} +/* line 85, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.bottom.align-center::before { + left: 50%; + transform: translateX(-50%); +} +/* line 92, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.top::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #0a0a0a transparent transparent; + top: 100%; + bottom: auto; +} +/* line 98, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.top.align-center::before { + left: 50%; + transform: translateX(-50%); +} +/* line 105, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.left::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #0a0a0a; + left: 100%; +} +/* line 110, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.left.align-center::before { + bottom: auto; + top: 50%; + transform: translateY(-50%); +} +/* line 118, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.right::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #0a0a0a transparent transparent; + right: 100%; + left: auto; +} +/* line 124, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.right.align-center::before { + bottom: auto; + top: 50%; + transform: translateY(-50%); +} +/* line 131, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.align-top::before { + bottom: auto; + top: 10%; +} +/* line 136, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.align-bottom::before { + bottom: 10%; + top: auto; +} +/* line 141, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.align-left::before { + left: 10%; + right: auto; +} +/* line 146, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_tooltip.scss */ +.tooltip.align-right::before { + left: auto; + right: 10%; +} + +/* line 122, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + flex-wrap: wrap; +} +/* line 47, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar, +.top-bar ul { + background-color: #e6e6e6; +} +/* line 60, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar input { + max-width: 200px; + margin-right: 1rem; +} +/* line 66, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar .input-group-field { + width: 100%; + margin-right: 0; +} +/* line 71, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar input.button { + width: auto; +} +/* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar .top-bar-left, +.top-bar .top-bar-right { + flex: 0 0 100%; + max-width: 100%; +} +@media print, screen and (min-width: 40em) { + /* line 122, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar { + flex-wrap: nowrap; + } + /* line 102, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar .top-bar-left { + flex: 1 1 auto; + margin-right: auto; + } + /* line 107, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar .top-bar-right { + flex: 0 1 auto; + margin-left: auto; + } +} +@media screen and (max-width: 63.9375em) { + /* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar.stacked-for-medium { + flex-wrap: wrap; + } + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar.stacked-for-medium .top-bar-left, + .top-bar.stacked-for-medium .top-bar-right { + flex: 0 0 100%; + max-width: 100%; + } +} +@media screen and (max-width: 74.9375em) { + /* line 135, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar.stacked-for-large { + flex-wrap: wrap; + } + /* line 82, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ + .top-bar.stacked-for-large .top-bar-left, + .top-bar.stacked-for-large .top-bar-right { + flex: 0 0 100%; + max-width: 100%; + } +} + +/* line 146, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar-title { + flex: 0 0 auto; + margin: 0.5rem 1rem 0.5rem 0; +} + +/* line 151, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/components/_top-bar.scss */ +.top-bar-left, +.top-bar-right { + flex: 0 0 auto; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateY(-100%); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-down.mui-enter.mui-enter-active { + transform: translateY(0); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateX(-100%); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-left.mui-enter.mui-enter-active { + transform: translateX(0); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateY(100%); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-up.mui-enter.mui-enter-active { + transform: translateY(0); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateX(100%); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-in-right.mui-enter.mui-enter-active { + transform: translateX(0); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateY(0); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-down.mui-leave.mui-leave-active { + transform: translateY(100%); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateX(0); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-right.mui-leave.mui-leave-active { + transform: translateX(100%); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateY(0); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-up.mui-leave.mui-leave-active { + transform: translateY(-100%); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: translateX(0); + transition-property: transform, opacity; + backface-visibility: hidden; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.slide-out-left.mui-leave.mui-leave-active { + transform: translateX(-100%); +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.fade-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 0; + transition-property: opacity; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.fade-in.mui-enter.mui-enter-active { + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.fade-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 1; + transition-property: opacity; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.fade-out.mui-leave.mui-leave-active { + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-top.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + transform-origin: top; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-top.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + transform-origin: right; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-right.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-bottom.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(90deg); + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-bottom.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(90deg); + transform-origin: left; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-left.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-middle-x.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-middle-x.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-middle-y.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-in-from-middle-y.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-top.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: top; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-top.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: right; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-right.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-bottom.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-bottom.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: left; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-left.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-middle-x.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-middle-x.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-middle-y.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.hinge-out-from-middle-y.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: scale(0.5); + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-in-up.mui-enter.mui-enter-active { + transform: scale(1); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: scale(1.5); + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-in-down.mui-enter.mui-enter-active { + transform: scale(1); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-out-up.mui-leave.mui-leave-active { + transform: scale(1.5); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.scale-out-down.mui-leave.mui-leave-active { + transform: scale(0.5); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: rotate(-0.75turn); + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-in.mui-enter.mui-enter-active { + transform: rotate(0); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-out.mui-leave.mui-leave-active { + transform: rotate(0.75turn); + opacity: 0; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-in-ccw.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: rotate(0.75turn); + transition-property: transform, opacity; + opacity: 0; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-in-ccw.mui-enter.mui-enter-active { + transform: rotate(0); + opacity: 1; +} + +/* line 22, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-out-ccw.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; +} +/* line 34, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/util/_transition.scss */ +.spin-out-ccw.mui-leave.mui-leave-active { + transform: rotate(-0.75turn); + opacity: 0; +} + +/* line 56, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.slow { + transition-duration: 750ms !important; +} + +/* line 56, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.fast { + transition-duration: 250ms !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.linear { + transition-timing-function: linear !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease { + transition-timing-function: ease !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-in { + transition-timing-function: ease-in !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-out { + transition-timing-function: ease-out !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-in-out { + transition-timing-function: ease-in-out !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-in { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-out { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; +} + +/* line 62, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-in-out { + transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; +} + +/* line 68, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.short-delay { + transition-delay: 300ms !important; +} + +/* line 68, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.long-delay { + transition-delay: 700ms !important; +} + +/* line 76, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.shake { + animation-name: shake-7; +} +@keyframes shake-7 { + 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { + transform: translateX(7%); + } + 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { + transform: translateX(-7%); + } +} +/* line 77, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.spin-cw { + animation-name: spin-cw-1turn; +} +@keyframes spin-cw-1turn { + 0% { + transform: rotate(-1turn); + } + 100% { + transform: rotate(0); + } +} +/* line 78, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.spin-ccw { + animation-name: spin-cw-1turn; +} +@keyframes spin-cw-1turn { + 0% { + transform: rotate(0); + } + 100% { + transform: rotate(1turn); + } +} +/* line 79, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.wiggle { + animation-name: wiggle-7deg; +} +@keyframes wiggle-7deg { + 40%, 50%, 60% { + transform: rotate(7deg); + } + 35%, 45%, 55%, 65% { + transform: rotate(-7deg); + } + 0%, 30%, 70%, 100% { + transform: rotate(0); + } +} +/* line 81, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.shake, +.spin-cw, +.spin-ccw, +.wiggle { + animation-duration: 500ms; +} + +/* line 90, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.infinite { + animation-iteration-count: infinite; +} + +/* line 94, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.slow { + animation-duration: 750ms !important; +} + +/* line 94, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.fast { + animation-duration: 250ms !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.linear { + animation-timing-function: linear !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease { + animation-timing-function: ease !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-in { + animation-timing-function: ease-in !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-out { + animation-timing-function: ease-out !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.ease-in-out { + animation-timing-function: ease-in-out !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-in { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-out { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; +} + +/* line 100, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.bounce-in-out { + animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; +} + +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.short-delay { + animation-delay: 300ms !important; +} + +/* line 106, /Users/kimberley/.rvm/gems/ruby-2.4.0/gems/foundation-rails-6.4.1.2/vendor/assets/scss/motion-ui/_classes.scss */ +.long-delay { + animation-delay: 700ms !important; +} +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + + + + + */ + + + #myCanvas{ + background-color: black; + color: white; + } + +body { + width: 100%; +} + +.logo { + font-family: 'Meddon', cursive; + font-weight: bold; + font-size: 4rem; + float: left; + +} + +.nav-links { + font-size: 2rem; + float: right; +} + +.nav-links a { + padding: .5rem; +} + +.header { + margin: 1rem 0rem 1rem 0rem; + width: 100%; +} + +.all-products { + display: flex; + flex-flow: row; + flex-wrap: wrap; +} + +.info-card { + clear: both; + margin-left: -15px; + margin-right: -15px; + overflow: hidden; +} + +.product { + display: flex; + flex-flow: column; + padding: 1em; + text-align: left; + color: #0F5364; + font-family: 'Slabo 13px', serif; + width: 20rem; + background-color: grey; + margin: 1rem; +} diff --git a/public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css.gz b/public/assets/application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..124b9803e9f5da8c75145cd34ee152621eb7f21f GIT binary patch literal 22394 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 literal 0 HcmV?d00001 diff --git a/public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js b/public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js new file mode 100644 index 0000000000..87a4b3b687 --- /dev/null +++ b/public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js @@ -0,0 +1,20023 @@ +// Create an array to store our particles +var particles = []; + +// The amount of particles to render +var particleCount = 30; + +// The maximum velocity in each direction +var maxVelocity = 2; + +// The target frames per second (how often do we want to update / redraw the scene) +var targetFPS = 33; + +// Set the dimensions of the canvas as variables so they can be used. +var canvasWidth = 400; +var canvasHeight = 400; + +// Create an image object (only need one instance) +var imageObj = new Image(); + +// Once the image has been downloaded then set the image on all of the particles +imageObj.onload = function() { + particles.forEach(function(particle) { + particle.setImage(imageObj); + }); +}; + +// Once the callback is arranged then set the source of the image +imageObj.src = "http://www.blog.jonnycornwell.com/wp-content/uploads/2012/07/Smoke10.png"; + +// A function to create a particle object. +function Particle(context) { + + // Set the initial x and y positions + this.x = 0; + this.y = 0; + + // Set the initial velocity + this.xVelocity = 0; + this.yVelocity = 0; + + // Set the radius + this.radius = 5; + + // Store the context which will be used to draw the particle + this.context = context; + + // The function to draw the particle on the canvas. + this.draw = function() { + + // If an image is set draw it + if(this.image){ + this.context.drawImage(this.image, this.x-128, this.y-128); + // If the image is being rendered do not draw the circle so break out of the draw function + return; + } + // Draw the circle as before, with the addition of using the position and the radius from this object. + this.context.beginPath(); + this.context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI, false); + this.context.fillStyle = "rgba(0, 255, 255, 1)"; + this.context.fill(); + this.context.closePath(); + }; + + // Update the particle. + this.update = function() { + // Update the position of the particle with the addition of the velocity. + this.x += this.xVelocity; + this.y += this.yVelocity; + + // Check if has crossed the right edge + if (this.x >= canvasWidth) { + this.xVelocity = -this.xVelocity; + this.x = canvasWidth; + } + // Check if has crossed the left edge + else if (this.x <= 0) { + this.xVelocity = -this.xVelocity; + this.x = 0; + } + + // Check if has crossed the bottom edge + if (this.y >= canvasHeight) { + this.yVelocity = -this.yVelocity; + this.y = canvasHeight; + } + + // Check if has crossed the top edge + else if (this.y <= 0) { + this.yVelocity = -this.yVelocity; + this.y = 0; + } + }; + + // A function to set the position of the particle. + this.setPosition = function(x, y) { + this.x = x; + this.y = y; + }; + + // Function to set the velocity. + this.setVelocity = function(x, y) { + this.xVelocity = x; + this.yVelocity = y; + }; + + this.setImage = function(image){ + this.image = image; + } +} + +// A function to generate a random number between 2 values +function generateRandom(min, max){ + return Math.random() * (max - min) + min; +} + +// The canvas context if it is defined. +var context; + +// Initialise the scene and set the context if possible +function init() { + var canvas = document.getElementById('myCanvas'); + if (canvas.getContext) { + + // Set the context variable so it can be re-used + context = canvas.getContext('2d'); + + // Create the particles and set their initial positions and velocities + for(var i=0; i < particleCount; ++i){ + var particle = new Particle(context); + + // Set the position to be inside the canvas bounds + particle.setPosition(generateRandom(0, canvasWidth), generateRandom(0, canvasHeight)); + + // Set the initial velocity to be either random and either negative or positive + particle.setVelocity(generateRandom(-maxVelocity, maxVelocity), generateRandom(-maxVelocity, maxVelocity)); + particles.push(particle); + } + } + else { + alert("Please use a modern browser"); + } +} + +// The function to draw the scene +function draw() { + // Clear the drawing surface and fill it with a black background + context.fillStyle = "rgba(0, 0, 0, 0.5)"; + context.fillRect(0, 0, 400, 400); + + // Go through all of the particles and draw them. + particles.forEach(function(particle) { + particle.draw(); + }); +} + +// Update the scene +function update() { + particles.forEach(function(particle) { + particle.update(); + }); +} + +// Initialize the scene +init(); + +// If the context is set then we can draw the scene (if not then the browser does not support canvas) +if (context) { + setInterval(function() { + // Update the scene befoe drawing + update(); + + // Draw the scene + draw(); + }, 1000 / targetFPS); +} +; +/* +Unobtrusive JavaScript +https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts +Released under the MIT license + */ + + +(function() { + var context = this; + + (function() { + (function() { + this.Rails = { + linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]', + buttonClickSelector: { + selector: 'button[data-remote]:not([form]), button[data-confirm]:not([form])', + exclude: 'form button' + }, + inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', + formSubmitSelector: 'form', + formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])', + formDisableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled', + formEnableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled', + fileInputSelector: 'input[name][type=file]:not([disabled])', + linkDisableSelector: 'a[data-disable-with], a[data-disable]', + buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]' + }; + + }).call(this); + }).call(context); + + var Rails = context.Rails; + + (function() { + (function() { + var expando, m; + + m = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector; + + Rails.matches = function(element, selector) { + if (selector.exclude != null) { + return m.call(element, selector.selector) && !m.call(element, selector.exclude); + } else { + return m.call(element, selector); + } + }; + + expando = '_ujsData'; + + Rails.getData = function(element, key) { + var ref; + return (ref = element[expando]) != null ? ref[key] : void 0; + }; + + Rails.setData = function(element, key, value) { + if (element[expando] == null) { + element[expando] = {}; + } + return element[expando][key] = value; + }; + + Rails.$ = function(selector) { + return Array.prototype.slice.call(document.querySelectorAll(selector)); + }; + + }).call(this); + (function() { + var $, csrfParam, csrfToken; + + $ = Rails.$; + + csrfToken = Rails.csrfToken = function() { + var meta; + meta = document.querySelector('meta[name=csrf-token]'); + return meta && meta.content; + }; + + csrfParam = Rails.csrfParam = function() { + var meta; + meta = document.querySelector('meta[name=csrf-param]'); + return meta && meta.content; + }; + + Rails.CSRFProtection = function(xhr) { + var token; + token = csrfToken(); + if (token != null) { + return xhr.setRequestHeader('X-CSRF-Token', token); + } + }; + + Rails.refreshCSRFTokens = function() { + var param, token; + token = csrfToken(); + param = csrfParam(); + if ((token != null) && (param != null)) { + return $('form input[name="' + param + '"]').forEach(function(input) { + return input.value = token; + }); + } + }; + + }).call(this); + (function() { + var CustomEvent, fire, matches; + + matches = Rails.matches; + + CustomEvent = window.CustomEvent; + + if (typeof CustomEvent !== 'function') { + CustomEvent = function(event, params) { + var evt; + evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + }; + CustomEvent.prototype = window.Event.prototype; + } + + fire = Rails.fire = function(obj, name, data) { + var event; + event = new CustomEvent(name, { + bubbles: true, + cancelable: true, + detail: data + }); + obj.dispatchEvent(event); + return !event.defaultPrevented; + }; + + Rails.stopEverything = function(e) { + fire(e.target, 'ujs:everythingStopped'); + e.preventDefault(); + e.stopPropagation(); + return e.stopImmediatePropagation(); + }; + + Rails.delegate = function(element, selector, eventType, handler) { + return element.addEventListener(eventType, function(e) { + var target; + target = e.target; + while (!(!(target instanceof Element) || matches(target, selector))) { + target = target.parentNode; + } + if (target instanceof Element && handler.call(target, e) === false) { + e.preventDefault(); + return e.stopPropagation(); + } + }); + }; + + }).call(this); + (function() { + var AcceptHeaders, CSRFProtection, createXHR, fire, prepareOptions, processResponse; + + CSRFProtection = Rails.CSRFProtection, fire = Rails.fire; + + AcceptHeaders = { + '*': '*/*', + text: 'text/plain', + html: 'text/html', + xml: 'application/xml, text/xml', + json: 'application/json, text/javascript', + script: 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript' + }; + + Rails.ajax = function(options) { + var xhr; + options = prepareOptions(options); + xhr = createXHR(options, function() { + var response; + response = processResponse(xhr.response, xhr.getResponseHeader('Content-Type')); + if (Math.floor(xhr.status / 100) === 2) { + if (typeof options.success === "function") { + options.success(response, xhr.statusText, xhr); + } + } else { + if (typeof options.error === "function") { + options.error(response, xhr.statusText, xhr); + } + } + return typeof options.complete === "function" ? options.complete(xhr, xhr.statusText) : void 0; + }); + if (typeof options.beforeSend === "function") { + options.beforeSend(xhr, options); + } + if (xhr.readyState === XMLHttpRequest.OPENED) { + return xhr.send(options.data); + } else { + return fire(document, 'ajaxStop'); + } + }; + + prepareOptions = function(options) { + options.url = options.url || location.href; + options.type = options.type.toUpperCase(); + if (options.type === 'GET' && options.data) { + if (options.url.indexOf('?') < 0) { + options.url += '?' + options.data; + } else { + options.url += '&' + options.data; + } + } + if (AcceptHeaders[options.dataType] == null) { + options.dataType = '*'; + } + options.accept = AcceptHeaders[options.dataType]; + if (options.dataType !== '*') { + options.accept += ', */*; q=0.01'; + } + return options; + }; + + createXHR = function(options, done) { + var xhr; + xhr = new XMLHttpRequest(); + xhr.open(options.type, options.url, true); + xhr.setRequestHeader('Accept', options.accept); + if (typeof options.data === 'string') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); + } + if (!options.crossDomain) { + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + } + CSRFProtection(xhr); + xhr.withCredentials = !!options.withCredentials; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + return done(xhr); + } + }; + return xhr; + }; + + processResponse = function(response, type) { + var parser, script; + if (typeof response === 'string' && typeof type === 'string') { + if (type.match(/\bjson\b/)) { + try { + response = JSON.parse(response); + } catch (error) {} + } else if (type.match(/\b(?:java|ecma)script\b/)) { + script = document.createElement('script'); + script.text = response; + document.head.appendChild(script).parentNode.removeChild(script); + } else if (type.match(/\b(xml|html|svg)\b/)) { + parser = new DOMParser(); + type = type.replace(/;.+/, ''); + try { + response = parser.parseFromString(response, type); + } catch (error) {} + } + } + return response; + }; + + Rails.href = function(element) { + return element.href; + }; + + Rails.isCrossDomain = function(url) { + var e, originAnchor, urlAnchor; + originAnchor = document.createElement('a'); + originAnchor.href = location.href; + urlAnchor = document.createElement('a'); + try { + urlAnchor.href = url; + return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) || (originAnchor.protocol + '//' + originAnchor.host === urlAnchor.protocol + '//' + urlAnchor.host)); + } catch (error) { + e = error; + return true; + } + }; + + }).call(this); + (function() { + var matches, toArray; + + matches = Rails.matches; + + toArray = function(e) { + return Array.prototype.slice.call(e); + }; + + Rails.serializeElement = function(element, additionalParam) { + var inputs, params; + inputs = [element]; + if (matches(element, 'form')) { + inputs = toArray(element.elements); + } + params = []; + inputs.forEach(function(input) { + if (!input.name) { + return; + } + if (matches(input, 'select')) { + return toArray(input.options).forEach(function(option) { + if (option.selected) { + return params.push({ + name: input.name, + value: option.value + }); + } + }); + } else if (input.checked || ['radio', 'checkbox', 'submit'].indexOf(input.type) === -1) { + return params.push({ + name: input.name, + value: input.value + }); + } + }); + if (additionalParam) { + params.push(additionalParam); + } + return params.map(function(param) { + if (param.name != null) { + return (encodeURIComponent(param.name)) + "=" + (encodeURIComponent(param.value)); + } else { + return param; + } + }).join('&'); + }; + + Rails.formElements = function(form, selector) { + if (matches(form, 'form')) { + return toArray(form.elements).filter(function(el) { + return matches(el, selector); + }); + } else { + return toArray(form.querySelectorAll(selector)); + } + }; + + }).call(this); + (function() { + var allowAction, fire, stopEverything; + + fire = Rails.fire, stopEverything = Rails.stopEverything; + + Rails.handleConfirm = function(e) { + if (!allowAction(this)) { + return stopEverything(e); + } + }; + + allowAction = function(element) { + var answer, callback, message; + message = element.getAttribute('data-confirm'); + if (!message) { + return true; + } + answer = false; + if (fire(element, 'confirm')) { + try { + answer = confirm(message); + } catch (error) {} + callback = fire(element, 'confirm:complete', [answer]); + } + return answer && callback; + }; + + }).call(this); + (function() { + var disableFormElement, disableFormElements, disableLinkElement, enableFormElement, enableFormElements, enableLinkElement, formElements, getData, matches, setData, stopEverything; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, stopEverything = Rails.stopEverything, formElements = Rails.formElements; + + Rails.handleDisabledElement = function(e) { + var element; + element = this; + if (element.disabled) { + return stopEverything(e); + } + }; + + Rails.enableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return enableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formEnableSelector)) { + return enableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return enableFormElements(element); + } + }; + + Rails.disableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return disableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formDisableSelector)) { + return disableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return disableFormElements(element); + } + }; + + disableLinkElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } + element.addEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', true); + }; + + enableLinkElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + element.innerHTML = originalText; + setData(element, 'ujs:enable-with', null); + } + element.removeEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', null); + }; + + disableFormElements = function(form) { + return formElements(form, Rails.formDisableSelector).forEach(disableFormElement); + }; + + disableFormElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + if (matches(element, 'button')) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } else { + setData(element, 'ujs:enable-with', element.value); + element.value = replacement; + } + } + element.disabled = true; + return setData(element, 'ujs:disabled', true); + }; + + enableFormElements = function(form) { + return formElements(form, Rails.formEnableSelector).forEach(enableFormElement); + }; + + enableFormElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + if (matches(element, 'button')) { + element.innerHTML = originalText; + } else { + element.value = originalText; + } + setData(element, 'ujs:enable-with', null); + } + element.disabled = false; + return setData(element, 'ujs:disabled', null); + }; + + }).call(this); + (function() { + var stopEverything; + + stopEverything = Rails.stopEverything; + + Rails.handleMethod = function(e) { + var csrfParam, csrfToken, form, formContent, href, link, method; + link = this; + method = link.getAttribute('data-method'); + if (!method) { + return; + } + href = Rails.href(link); + csrfToken = Rails.csrfToken(); + csrfParam = Rails.csrfParam(); + form = document.createElement('form'); + formContent = ""; + if ((csrfParam != null) && (csrfToken != null) && !Rails.isCrossDomain(href)) { + formContent += ""; + } + formContent += ''; + form.method = 'post'; + form.action = href; + form.target = link.target; + form.innerHTML = formContent; + form.style.display = 'none'; + document.body.appendChild(form); + form.querySelector('[type="submit"]').click(); + return stopEverything(e); + }; + + }).call(this); + (function() { + var ajax, fire, getData, isCrossDomain, isRemote, matches, serializeElement, setData, stopEverything, + slice = [].slice; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, fire = Rails.fire, stopEverything = Rails.stopEverything, ajax = Rails.ajax, isCrossDomain = Rails.isCrossDomain, serializeElement = Rails.serializeElement; + + isRemote = function(element) { + var value; + value = element.getAttribute('data-remote'); + return (value != null) && value !== 'false'; + }; + + Rails.handleRemote = function(e) { + var button, data, dataType, element, method, url, withCredentials; + element = this; + if (!isRemote(element)) { + return true; + } + if (!fire(element, 'ajax:before')) { + fire(element, 'ajax:stopped'); + return false; + } + withCredentials = element.getAttribute('data-with-credentials'); + dataType = element.getAttribute('data-type') || 'script'; + if (matches(element, Rails.formSubmitSelector)) { + button = getData(element, 'ujs:submit-button'); + method = getData(element, 'ujs:submit-button-formmethod') || element.method; + url = getData(element, 'ujs:submit-button-formaction') || element.getAttribute('action') || location.href; + if (method.toUpperCase() === 'GET') { + url = url.replace(/\?.*$/, ''); + } + if (element.enctype === 'multipart/form-data') { + data = new FormData(element); + if (button != null) { + data.append(button.name, button.value); + } + } else { + data = serializeElement(element, button); + } + setData(element, 'ujs:submit-button', null); + setData(element, 'ujs:submit-button-formmethod', null); + setData(element, 'ujs:submit-button-formaction', null); + } else if (matches(element, Rails.buttonClickSelector) || matches(element, Rails.inputChangeSelector)) { + method = element.getAttribute('data-method'); + url = element.getAttribute('data-url'); + data = serializeElement(element, element.getAttribute('data-params')); + } else { + method = element.getAttribute('data-method'); + url = Rails.href(element); + data = element.getAttribute('data-params'); + } + ajax({ + type: method || 'GET', + url: url, + data: data, + dataType: dataType, + beforeSend: function(xhr, options) { + if (fire(element, 'ajax:beforeSend', [xhr, options])) { + return fire(element, 'ajax:send', [xhr]); + } else { + fire(element, 'ajax:stopped'); + return xhr.abort(); + } + }, + success: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:success', args); + }, + error: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:error', args); + }, + complete: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:complete', args); + }, + crossDomain: isCrossDomain(url), + withCredentials: (withCredentials != null) && withCredentials !== 'false' + }); + return stopEverything(e); + }; + + Rails.formSubmitButtonClick = function(e) { + var button, form; + button = this; + form = button.form; + if (!form) { + return; + } + if (button.name) { + setData(form, 'ujs:submit-button', { + name: button.name, + value: button.value + }); + } + setData(form, 'ujs:formnovalidate-button', button.formNoValidate); + setData(form, 'ujs:submit-button-formaction', button.getAttribute('formaction')); + return setData(form, 'ujs:submit-button-formmethod', button.getAttribute('formmethod')); + }; + + Rails.handleMetaClick = function(e) { + var data, link, metaClick, method; + link = this; + method = (link.getAttribute('data-method') || 'GET').toUpperCase(); + data = link.getAttribute('data-params'); + metaClick = e.metaKey || e.ctrlKey; + if (metaClick && method === 'GET' && !data) { + return e.stopImmediatePropagation(); + } + }; + + }).call(this); + (function() { + var $, CSRFProtection, delegate, disableElement, enableElement, fire, formSubmitButtonClick, getData, handleConfirm, handleDisabledElement, handleMetaClick, handleMethod, handleRemote, refreshCSRFTokens; + + fire = Rails.fire, delegate = Rails.delegate, getData = Rails.getData, $ = Rails.$, refreshCSRFTokens = Rails.refreshCSRFTokens, CSRFProtection = Rails.CSRFProtection, enableElement = Rails.enableElement, disableElement = Rails.disableElement, handleDisabledElement = Rails.handleDisabledElement, handleConfirm = Rails.handleConfirm, handleRemote = Rails.handleRemote, formSubmitButtonClick = Rails.formSubmitButtonClick, handleMetaClick = Rails.handleMetaClick, handleMethod = Rails.handleMethod; + + if ((typeof jQuery !== "undefined" && jQuery !== null) && (jQuery.ajax != null) && !jQuery.rails) { + jQuery.rails = Rails; + jQuery.ajaxPrefilter(function(options, originalOptions, xhr) { + if (!options.crossDomain) { + return CSRFProtection(xhr); + } + }); + } + + Rails.start = function() { + if (window._rails_loaded) { + throw new Error('rails-ujs has already been loaded!'); + } + window.addEventListener('pageshow', function() { + $(Rails.formEnableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + return $(Rails.linkDisableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + }); + delegate(document, Rails.linkDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.linkDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.linkClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.linkClickSelector, 'click', handleConfirm); + delegate(document, Rails.linkClickSelector, 'click', handleMetaClick); + delegate(document, Rails.linkClickSelector, 'click', disableElement); + delegate(document, Rails.linkClickSelector, 'click', handleRemote); + delegate(document, Rails.linkClickSelector, 'click', handleMethod); + delegate(document, Rails.buttonClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.buttonClickSelector, 'click', handleConfirm); + delegate(document, Rails.buttonClickSelector, 'click', disableElement); + delegate(document, Rails.buttonClickSelector, 'click', handleRemote); + delegate(document, Rails.inputChangeSelector, 'change', handleDisabledElement); + delegate(document, Rails.inputChangeSelector, 'change', handleConfirm); + delegate(document, Rails.inputChangeSelector, 'change', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', handleDisabledElement); + delegate(document, Rails.formSubmitSelector, 'submit', handleConfirm); + delegate(document, Rails.formSubmitSelector, 'submit', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', function(e) { + return setTimeout((function() { + return disableElement(e); + }), 13); + }); + delegate(document, Rails.formSubmitSelector, 'ajax:send', disableElement); + delegate(document, Rails.formSubmitSelector, 'ajax:complete', enableElement); + delegate(document, Rails.formInputClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.formInputClickSelector, 'click', handleConfirm); + delegate(document, Rails.formInputClickSelector, 'click', formSubmitButtonClick); + document.addEventListener('DOMContentLoaded', refreshCSRFTokens); + return window._rails_loaded = true; + }; + + if (window.Rails === Rails && fire(document, 'rails:attachBindings')) { + Rails.start(); + } + + }).call(this); + }).call(this); + + if (typeof module === "object" && module.exports) { + module.exports = Rails; + } else if (typeof define === "function" && define.amd) { + define(Rails); + } +}).call(this); +/******/ + (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 = 6); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return rtl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return GetYoDigits; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", 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"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* 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_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(4); + + + +__WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */].addToJquery(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + +// These are now separated out, but historically were a part of this module, +// and since this is here for backwards compatibility we include them in +// this entry. + +__WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */].rtl = __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["a" /* rtl */]; +__WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */].GetYoDigits = __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["b" /* GetYoDigits */]; +__WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */].transitionend = __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["c" /* transitionend */]; + +// Every plugin depends on plugin now, we can include that on the core for the +// script inclusion path. + + +__WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */].Plugin = __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["a" /* Plugin */]; + +window.Foundation = __WEBPACK_IMPORTED_MODULE_1__foundation_core__["a" /* Foundation */]; + +/***/ }), +/* 3 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Foundation; }); +/* 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_util_mediaQuery__ = __webpack_require__(5); + + + + + + +var FOUNDATION_VERSION = '6.4.1'; + +// Global Foundation object +// This is attached to the window, or used as a module for AMD/Browserify +var Foundation = { + version: FOUNDATION_VERSION, + + /** + * Stores initialized plugins. + */ + _plugins: {}, + + /** + * Stores generated unique ids for plugin instances + */ + _uuids: [], + + /** + * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing. + * @param {Object} plugin - The constructor of the plugin. + */ + plugin: function (plugin, name) { + // Object key to use when adding to global Foundation object + // Examples: Foundation.Reveal, Foundation.OffCanvas + var className = name || functionName(plugin); + // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin + // Examples: data-reveal, data-off-canvas + var attrName = hyphenate(className); + + // Add to the Foundation object and the plugins list (for reflowing) + this._plugins[attrName] = this[className] = plugin; + }, + /** + * @function + * Populates the _uuids array with pointers to each individual plugin instance. + * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls. + * Also fires the initialization event for each plugin, consolidating repetitive code. + * @param {Object} plugin - an instance of a plugin, usually `this` in context. + * @param {String} name - the name of the plugin, passed as a camelCased string. + * @fires Plugin#init + */ + registerPlugin: function (plugin, name) { + var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase(); + plugin.uuid = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["b" /* GetYoDigits */])(6, pluginName); + + if (!plugin.$element.attr('data-' + pluginName)) { + plugin.$element.attr('data-' + pluginName, plugin.uuid); + } + if (!plugin.$element.data('zfPlugin')) { + plugin.$element.data('zfPlugin', plugin); + } + /** + * Fires when the plugin has initialized. + * @event Plugin#init + */ + plugin.$element.trigger('init.zf.' + pluginName); + + this._uuids.push(plugin.uuid); + + return; + }, + /** + * @function + * Removes the plugins uuid from the _uuids array. + * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute. + * Also fires the destroyed event for the plugin, consolidating repetitive code. + * @param {Object} plugin - an instance of a plugin, usually `this` in context. + * @fires Plugin#destroyed + */ + unregisterPlugin: function (plugin) { + var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor)); + + this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1); + plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin') + /** + * Fires when the plugin has been destroyed. + * @event Plugin#destroyed + */ + .trigger('destroyed.zf.' + pluginName); + for (var prop in plugin) { + plugin[prop] = null; //clean up script to prep for garbage collection. + } + return; + }, + + /** + * @function + * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc. + * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'` + * @default If no argument is passed, reflow all currently active plugins. + */ + reInit: function (plugins) { + var isJQ = plugins instanceof __WEBPACK_IMPORTED_MODULE_0_jquery___default.a; + try { + if (isJQ) { + plugins.each(function () { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('zfPlugin')._init(); + }); + } else { + var type = typeof plugins, + _this = this, + fns = { + 'object': function (plgs) { + plgs.forEach(function (p) { + p = hyphenate(p); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-' + p + ']').foundation('_init'); + }); + }, + 'string': function () { + plugins = hyphenate(plugins); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-' + plugins + ']').foundation('_init'); + }, + 'undefined': function () { + this['object'](Object.keys(_this._plugins)); + } + }; + fns[type](plugins); + } + } catch (err) { + console.error(err); + } finally { + return plugins; + } + }, + + /** + * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized. + * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object. + * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything. + */ + reflow: function (elem, plugins) { + + // If plugins is undefined, just grab everything + if (typeof plugins === 'undefined') { + plugins = Object.keys(this._plugins); + } + // If plugins is a string, convert it to an array with one item + else if (typeof plugins === 'string') { + plugins = [plugins]; + } + + var _this = this; + + // Iterate through each plugin + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.each(plugins, function (i, name) { + // Get the current plugin + var plugin = _this._plugins[name]; + + // Localize the search to all elements inside elem, as well as elem itself, unless elem === document + var $elem = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(elem).find('[data-' + name + ']').addBack('[data-' + name + ']'); + + // For each plugin found, initialize it + $elem.each(function () { + var $el = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), + opts = {}; + // Don't double-dip on plugins + if ($el.data('zfPlugin')) { + console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin."); + return; + } + + if ($el.attr('data-options')) { + var thing = $el.attr('data-options').split(';').forEach(function (e, i) { + var opt = e.split(':').map(function (el) { + return el.trim(); + }); + if (opt[0]) opts[opt[0]] = parseValue(opt[1]); + }); + } + try { + $el.data('zfPlugin', new plugin(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), opts)); + } catch (er) { + console.error(er); + } finally { + return; + } + }); + }); + }, + getFnName: functionName, + + addToJquery: function ($) { + // TODO: consider not making this a jQuery function + // TODO: need way to reflow vs. re-initialize + /** + * The Foundation jQuery method. + * @param {String|Array} method - An action to perform on the current jQuery object. + */ + var foundation = function (method) { + var type = typeof method, + $noJS = $('.no-js'); + + if ($noJS.length) { + $noJS.removeClass('no-js'); + } + + if (type === 'undefined') { + //needs to initialize the Foundation object, or an individual plugin. + __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["a" /* MediaQuery */]._init(); + Foundation.reflow(this); + } else if (type === 'string') { + //an individual method to invoke on a plugin or group of plugins + var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary + var plugClass = this.data('zfPlugin'); //determine the class of plugin + + if (plugClass !== undefined && plugClass[method] !== undefined) { + //make sure both the class and method exist + if (this.length === 1) { + //if there's only one, call it directly. + plugClass[method].apply(plugClass, args); + } else { + this.each(function (i, el) { + //otherwise loop through the jQuery collection and invoke the method on each + plugClass[method].apply($(el).data('zfPlugin'), args); + }); + } + } else { + //error for no class or no method + throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.'); + } + } else { + //error for invalid argument type + throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.'); + } + return this; + }; + $.fn.foundation = foundation; + return $; + } +}; + +Foundation.util = { + /** + * Function for applying a debounce effect to a function call. + * @function + * @param {Function} func - Function to be called at end of timeout. + * @param {Number} delay - Time in ms to delay the call of `func`. + * @returns function + */ + throttle: function (func, delay) { + var timer = null; + + return function () { + var context = this, + args = arguments; + + if (timer === null) { + timer = setTimeout(function () { + func.apply(context, args); + timer = null; + }, delay); + } + }; + } +}; + +window.Foundation = Foundation; + +// Polyfill for requestAnimationFrame +(function () { + if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () { + return new Date().getTime(); + }; + + var vendors = ['webkit', 'moz']; + for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { + var vp = vendors[i]; + window.requestAnimationFrame = window[vp + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame']; + } + if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) { + var lastTime = 0; + window.requestAnimationFrame = function (callback) { + var now = Date.now(); + var nextTime = Math.max(lastTime + 16, now); + return setTimeout(function () { + callback(lastTime = nextTime); + }, nextTime - now); + }; + window.cancelAnimationFrame = clearTimeout; + } + /** + * Polyfill for performance.now, required by rAF + */ + if (!window.performance || !window.performance.now) { + window.performance = { + start: Date.now(), + now: function () { + return Date.now() - this.start; + } + }; + } +})(); +if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function () {}, + fBound = function () { + return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // native functions don't have a prototype + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; +} +// Polyfill to get the name of a function in IE9 +function functionName(fn) { + if (Function.prototype.name === undefined) { + var funcNameRegex = /function\s([^(]{1,})\(/; + var results = funcNameRegex.exec(fn.toString()); + return results && results.length > 1 ? results[1].trim() : ""; + } else if (fn.prototype === undefined) { + return fn.constructor.name; + } else { + return fn.prototype.constructor.name; + } +} +function parseValue(str) { + if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str); + return str; +} +// 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(); +} + + + +/***/ }), +/* 4 */ +/***/ (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__["b" /* 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); + } +} + + + +/***/ }), +/* 5 */ +/***/ (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; +} + + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(2); + + +/***/ }) +/******/ ]); +/******/ + (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 = 100); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 100: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(34); + + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 34: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_box__ = __webpack_require__(64); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Box = __WEBPACK_IMPORTED_MODULE_1__foundation_util_box__["a" /* Box */]; + +/***/ }), + +/***/ 64: +/***/ (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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_util_core__); + + + + +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, test) { + 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__["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__["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__["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 }; +} + + + +/***/ }) + +/******/ }); +/******/ + (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 = 101); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 101: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(35); + + +/***/ }), + +/***/ 35: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_imageLoader__ = __webpack_require__(65); + + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].onImagesLoaded = __WEBPACK_IMPORTED_MODULE_1__foundation_util_imageLoader__["a" /* onImagesLoaded */]; + +/***/ }), + +/***/ 65: +/***/ (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(); + } + } +} + + + +/***/ }) + +/******/ }); +/******/ + (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 = 102); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 102: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(36); + + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 36: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__ = __webpack_require__(66); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Keyboard = __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["a" /* Keyboard */]; + +/***/ }), + +/***/ 66: +/***/ (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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); +/******************************************* + * * + * 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__["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; +} + + + +/***/ }) + +/******/ }); +/******/ + (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 = 103); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 103: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(37); + + +/***/ }), + +/***/ 37: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__ = __webpack_require__(67); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].MediaQuery = __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["a" /* MediaQuery */]; + +/***/ }), + +/***/ 67: +/***/ (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; +} + + + +/***/ }) + +/******/ }); +/******/ + (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 = 104); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 104: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(38); + + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 38: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__ = __webpack_require__(68); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Motion = __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["a" /* Motion */]; +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Move = __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["b" /* Move */]; + +/***/ }), + +/***/ 68: +/***/ (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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); + + + + + +/** + * 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__["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); + } +} + + + +/***/ }) + +/******/ }); +/******/ + (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 = 105); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 105: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(39); + + +/***/ }), + +/***/ 39: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_nest__ = __webpack_require__(69); + + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Nest = __WEBPACK_IMPORTED_MODULE_1__foundation_util_nest__["a" /* Nest */]; + +/***/ }), + +/***/ 69: +/***/ (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', ''); + } +}; + + + +/***/ }) + +/******/ }); +/******/ + (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 = 106); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 106: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(40); + + +/***/ }), + +/***/ 40: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_timer__ = __webpack_require__(70); + + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].Timer = __WEBPACK_IMPORTED_MODULE_1__foundation_util_timer__["a" /* Timer */]; + +/***/ }), + +/***/ 70: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Timer; }); +/* 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__); + + + + +function Timer(elem, options, cb) { + var _this = this, + duration = options.duration, + //options is an object for easily adding features later. + nameSpace = Object.keys(elem.data())[0] || 'timer', + remain = -1, + start, + timer; + + this.isPaused = false; + + this.restart = function () { + remain = -1; + clearTimeout(timer); + this.start(); + }; + + this.start = function () { + this.isPaused = false; + // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + remain = remain <= 0 ? duration : remain; + elem.data('paused', false); + start = Date.now(); + timer = setTimeout(function () { + if (options.infinite) { + _this.restart(); //rerun the timer. + } + if (cb && typeof cb === 'function') { + cb(); + } + }, remain); + elem.trigger('timerstart.zf.' + nameSpace); + }; + + this.pause = function () { + this.isPaused = true; + //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + elem.data('paused', true); + var end = Date.now(); + remain = remain - (end - start); + elem.trigger('timerpaused.zf.' + nameSpace); + }; +} + + + +/***/ }) + +/******/ }); +'use strict'; + +!function ($) { + + function Timer(elem, options, cb) { + var _this = this, + duration = options.duration, + //options is an object for easily adding features later. + nameSpace = Object.keys(elem.data())[0] || 'timer', + remain = -1, + start, + timer; + + this.isPaused = false; + + this.restart = function () { + remain = -1; + clearTimeout(timer); + this.start(); + }; + + this.start = function () { + this.isPaused = false; + // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + remain = remain <= 0 ? duration : remain; + elem.data('paused', false); + start = Date.now(); + timer = setTimeout(function () { + if (options.infinite) { + _this.restart(); //rerun the timer. + } + if (cb && typeof cb === 'function') { + cb(); + } + }, remain); + elem.trigger('timerstart.zf.' + nameSpace); + }; + + this.pause = function () { + this.isPaused = true; + //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + elem.data('paused', true); + var end = Date.now(); + remain = remain - (end - start); + elem.trigger('timerpaused.zf.' + nameSpace); + }; + } + + /** + * 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.readyState === 4 || this.readyState === 'complete') { + singleImageLoaded(); + } + // Force load the image + else { + // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/ + var src = $(this).attr('src'); + $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime()); + $(this).one('load', function () { + singleImageLoaded(); + }); + } + }); + + function singleImageLoaded() { + unloaded--; + if (unloaded === 0) { + callback(); + } + } + } + + Foundation.Timer = Timer; + Foundation.onImagesLoaded = onImagesLoaded; +}(jQuery); +/******/ + (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 = 107); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 107: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(41); + + +/***/ }), + +/***/ 41: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* 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_touch__ = __webpack_require__(71); + + + + +__WEBPACK_IMPORTED_MODULE_1__foundation_util_touch__["a" /* Touch */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + +window.Foundation.Touch = __WEBPACK_IMPORTED_MODULE_1__foundation_util_touch__["a" /* Touch */]; + +/***/ }), + +/***/ 71: +/***/ (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($); + } +}; + + + +/***/ }) + +/******/ }); +/******/ + (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 = 108); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 108: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(42); + + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 42: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery__ = __webpack_require__(0); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_jquery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_triggers__ = __webpack_require__(7); + + + + +__WEBPACK_IMPORTED_MODULE_2__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_1_jquery___default.a, __WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"]); + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }) + +/******/ }); +/******/ + (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 = 79); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 13: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_abide__ = __webpack_require__(43); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_abide__["a" /* Abide */], 'Abide'); + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 43: +/***/ (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); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__); + + +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({}, 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
  • 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 +}; + + + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 8: +/***/ (function(module, exports) { + +module.exports = {Box: window.Foundation.Box}; + +/***/ }), + +/***/ 82: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(16); + + +/***/ }), + +/***/ 9: +/***/ (function(module, exports) { + +module.exports = {Nest: window.Foundation.Nest}; + +/***/ }) + +/******/ }); +/******/ + (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 = 83); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 11: +/***/ (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__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_box___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); + + +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__["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__["Box"].GetDimensions($element), + $anchorDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetDimensions($anchor); + + $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["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__["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__["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__["Box"].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset())); + } + } + }]); + + return Positionable; +}(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__["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"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_dropdown__ = __webpack_require__(47); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_dropdown__["a" /* Dropdown */], 'Dropdown'); + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 47: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Dropdown; }); +/* 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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_positionable__ = __webpack_require__(11); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_triggers__ = __webpack_require__(7); + + +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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +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; } + + + + + + + + +/** + * Dropdown module. + * @module foundation.dropdown + * @requires foundation.util.keyboard + * @requires foundation.util.box + * @requires foundation.util.triggers + */ + +var Dropdown = function (_Positionable) { + _inherits(Dropdown, _Positionable); + + function Dropdown() { + _classCallCheck(this, Dropdown); + + return _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).apply(this, arguments)); + } + + _createClass(Dropdown, [{ + key: '_setup', + + /** + * Creates a new instance of a dropdown. + * @class + * @name Dropdown + * @param {jQuery} element - jQuery object to make into a dropdown. + * Object should be of the dropdown panel, rather than its anchor. + * @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({}, Dropdown.defaults, this.$element.data(), options); + this.className = 'Dropdown'; // ie9 back compat + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_4__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + this._init(); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].register('Dropdown', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the plugin by setting/checking options and attributes, adding helper variables, and saving the anchor. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + var $id = this.$element.attr('id'); + + this.$anchor = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-toggle="' + $id + '"]').length ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-toggle="' + $id + '"]') : __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-open="' + $id + '"]'); + this.$anchor.attr({ + 'aria-controls': $id, + 'data-is-focus': false, + 'data-yeti-box': $id, + 'aria-haspopup': true, + 'aria-expanded': false + + }); + + if (this.options.parentClass) { + this.$parent = this.$element.parents('.' + this.options.parentClass); + } else { + this.$parent = null; + } + + this.$element.attr({ + 'aria-hidden': 'true', + 'data-yeti-box': $id, + 'data-resize': $id, + 'aria-labelledby': this.$anchor[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["GetYoDigits"])(6, 'dd-anchor') + }); + _get(Dropdown.prototype.__proto__ || Object.getPrototypeOf(Dropdown.prototype), '_init', this).call(this); + this._events(); + } + }, { + key: '_getDefaultPosition', + value: function _getDefaultPosition() { + // handle legacy classnames + var position = this.$element[0].className.match(/(top|left|right|bottom)/g); + if (position) { + return position[0]; + } else { + return 'bottom'; + } + } + }, { + key: '_getDefaultAlignment', + value: function _getDefaultAlignment() { + // handle legacy float approach + var horizontalPosition = /float-(\S+)/.exec(this.$anchor[0].className); + if (horizontalPosition) { + return horizontalPosition[1]; + } + + return _get(Dropdown.prototype.__proto__ || Object.getPrototypeOf(Dropdown.prototype), '_getDefaultAlignment', this).call(this); + } + + /** + * Sets the position and orientation of the dropdown pane, checks for collisions if allow-overlap is not true. + * Recursively calls itself if a collision is detected, with a new position class. + * @function + * @private + */ + + }, { + key: '_setPosition', + value: function _setPosition() { + _get(Dropdown.prototype.__proto__ || Object.getPrototypeOf(Dropdown.prototype), '_setPosition', this).call(this, this.$anchor, this.$element, this.$parent); + } + + /** + * Adds event listeners to the element utilizing the triggers utility library. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + this.$element.on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': this.close.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this), + 'resizeme.zf.trigger': this._setPosition.bind(this) + }); + + if (this.options.hover) { + this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { + var bodyData = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').data(); + if (typeof bodyData.whatinput === 'undefined' || bodyData.whatinput === 'mouse') { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.open(); + _this.$anchor.data('hover', true); + }, _this.options.hoverDelay); + } + }).on('mouseleave.zf.dropdown', function () { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.close(); + _this.$anchor.data('hover', false); + }, _this.options.hoverDelay); + }); + if (this.options.hoverPane) { + this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { + clearTimeout(_this.timeout); + }).on('mouseleave.zf.dropdown', function () { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.close(); + _this.$anchor.data('hover', false); + }, _this.options.hoverDelay); + }); + } + } + this.$anchor.add(this.$element).on('keydown.zf.dropdown', function (e) { + + var $target = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), + visibleFocusableElements = __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].findFocusable(_this.$element); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].handleKey(e, 'Dropdown', { + open: function () { + if ($target.is(_this.$anchor)) { + _this.open(); + _this.$element.attr('tabindex', -1).focus(); + e.preventDefault(); + } + }, + close: function () { + _this.close(); + _this.$anchor.focus(); + } + }); + }); + } + + /** + * 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).not(this.$element), + _this = this; + $body.off('click.zf.dropdown').on('click.zf.dropdown', function (e) { + if (_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) { + return; + } + if (_this.$element.find(e.target).length) { + return; + } + _this.close(); + $body.off('click.zf.dropdown'); + }); + } + + /** + * Opens the dropdown pane, and fires a bubbling event to close other dropdowns. + * @function + * @fires Dropdown#closeme + * @fires Dropdown#show + */ + + }, { + key: 'open', + value: function open() { + // var _this = this; + /** + * Fires to close other open dropdowns, typically when dropdown is opening + * @event Dropdown#closeme + */ + this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id')); + this.$anchor.addClass('hover').attr({ 'aria-expanded': true }); + // this.$element/*.show()*/; + + this.$element.addClass('is-opening'); + this._setPosition(); + this.$element.removeClass('is-opening').addClass('is-open').attr({ 'aria-hidden': false }); + + if (this.options.autoFocus) { + var $focusable = __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].findFocusable(this.$element); + if ($focusable.length) { + $focusable.eq(0).focus(); + } + } + + if (this.options.closeOnClick) { + this._addBodyHandler(); + } + + if (this.options.trapFocus) { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].trapFocus(this.$element); + } + + /** + * Fires once the dropdown is visible. + * @event Dropdown#show + */ + this.$element.trigger('show.zf.dropdown', [this.$element]); + } + + /** + * Closes the open dropdown pane. + * @function + * @fires Dropdown#hide + */ + + }, { + key: 'close', + value: function close() { + if (!this.$element.hasClass('is-open')) { + return false; + } + this.$element.removeClass('is-open').attr({ 'aria-hidden': true }); + + this.$anchor.removeClass('hover').attr('aria-expanded', false); + + /** + * Fires once the dropdown is no longer visible. + * @event Dropdown#hide + */ + this.$element.trigger('hide.zf.dropdown', [this.$element]); + + if (this.options.trapFocus) { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].releaseFocus(this.$element); + } + } + + /** + * Toggles the dropdown pane's visibility. + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.$element.hasClass('is-open')) { + if (this.$anchor.data('hover')) return; + this.close(); + } else { + this.open(); + } + } + + /** + * Destroys the dropdown. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('.zf.trigger').hide(); + this.$anchor.off('.zf.dropdown'); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document.body).off('click.zf.dropdown'); + } + }]); + + return Dropdown; +}(__WEBPACK_IMPORTED_MODULE_3__foundation_positionable__["a" /* Positionable */]); + +Dropdown.defaults = { + /** + * Class that designates bounding container of Dropdown (default: window) + * @option + * @type {?string} + * @default null + */ + parentClass: null, + /** + * Amount of time to delay opening a submenu on hover event. + * @option + * @type {number} + * @default 250 + */ + hoverDelay: 250, + /** + * Allow submenus to open on hover events + * @option + * @type {boolean} + * @default false + */ + hover: false, + /** + * Don't close dropdown when hovering over dropdown pane + * @option + * @type {boolean} + * @default false + */ + hoverPane: false, + /** + * Number of pixels between the dropdown pane and the triggering element on open. + * @option + * @type {number} + * @default 0 + */ + vOffset: 0, + /** + * Number of pixels between the dropdown pane and the triggering element on open. + * @option + * @type {number} + * @default 0 + */ + hOffset: 0, + /** + * DEPRECATED: Class applied to adjust open position. + * @option + * @type {string} + * @default '' + */ + positionClass: '', + + /** + * Position of dropdown. Can be left, right, bottom, top, or auto. + * @option + * @type {string} + * @default 'auto' + */ + position: 'auto', + /** + * Alignment of dropdown 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 will 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, + /** + * Allow the plugin to trap focus to the dropdown pane if opened with keyboard commands. + * @option + * @type {boolean} + * @default false + */ + trapFocus: false, + /** + * Allow the plugin to set focus to the first focusable element within the pane, regardless of method of opening. + * @option + * @type {boolean} + * @default false + */ + autoFocus: false, + /** + * Allows a click on the body to close the dropdown. + * @option + * @type {boolean} + * @default false + */ + closeOnClick: false +}; + + + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 8: +/***/ (function(module, exports) { + +module.exports = {Box: window.Foundation.Box}; + +/***/ }), + +/***/ 83: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(17); + + +/***/ }) + +/******/ }); +/******/ + (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 = 84); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 18: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_dropdownMenu__ = __webpack_require__(48); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_dropdownMenu__["a" /* DropdownMenu */], 'DropdownMenu'); + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 48: +/***/ (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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__ = __webpack_require__(9); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_box__ = __webpack_require__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_box___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_box__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__foundation_plugin__); + + +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 + + __WEBPACK_IMPORTED_MODULE_2__foundation_util_nest__["Nest"].Feather(this.$element, 'dropdown'); + this._init(); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["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() { + 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__["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__["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 () { + if (!$element.is(':last-child')) { + $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__["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__["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__["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__["Nest"].Burn(this.$element, 'dropdown'); + } + }]); + + return DropdownMenu; +}(__WEBPACK_IMPORTED_MODULE_5__foundation_plugin__["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 +}; + + + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 8: +/***/ (function(module, exports) { + +module.exports = {Box: window.Foundation.Box}; + +/***/ }), + +/***/ 84: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(18); + + +/***/ }), + +/***/ 9: +/***/ (function(module, exports) { + +module.exports = {Nest: window.Foundation.Nest}; + +/***/ }) + +/******/ }); +/******/ + (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 = 85); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 10: +/***/ (function(module, exports) { + +module.exports = {onImagesLoaded: window.Foundation.onImagesLoaded}; + +/***/ }), + +/***/ 19: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_equalizer__ = __webpack_require__(49); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_equalizer__["a" /* Equalizer */], 'Equalizer'); + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 49: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Equalizer; }); +/* 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_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__ = __webpack_require__(10); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__); + + +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; } + + + + + + + +/** + * Equalizer module. + * @module foundation.equalizer + * @requires foundation.util.mediaQuery + * @requires foundation.util.imageLoader if equalizer contains images + */ + +var Equalizer = function (_Plugin) { + _inherits(Equalizer, _Plugin); + + function Equalizer() { + _classCallCheck(this, Equalizer); + + return _possibleConstructorReturn(this, (Equalizer.__proto__ || Object.getPrototypeOf(Equalizer)).apply(this, arguments)); + } + + _createClass(Equalizer, [{ + key: '_setup', + + /** + * Creates a new instance of Equalizer. + * @class + * @name Equalizer + * @fires Equalizer#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({}, Equalizer.defaults, this.$element.data(), options); + this.className = 'Equalizer'; // ie9 back compat + + this._init(); + } + + /** + * Initializes the Equalizer plugin and calls functions to get equalizer functioning on load. + * @private + */ + + }, { + key: '_init', + value: function _init() { + var eqId = this.$element.attr('data-equalizer') || ''; + var $watched = this.$element.find('[data-equalizer-watch="' + eqId + '"]'); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"]._init(); + + this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]'); + this.$element.attr('data-resize', eqId || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["GetYoDigits"])(6, 'eq')); + this.$element.attr('data-mutate', eqId || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["GetYoDigits"])(6, 'eq')); + + this.hasNested = this.$element.find('[data-equalizer]').length > 0; + this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0; + this.isOn = false; + this._bindHandler = { + onResizeMeBound: this._onResizeMe.bind(this), + onPostEqualizedBound: this._onPostEqualized.bind(this) + }; + + var imgs = this.$element.find('img'); + var tooSmall; + if (this.options.equalizeOn) { + tooSmall = this._checkMQ(); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', this._checkMQ.bind(this)); + } else { + this._events(); + } + if (tooSmall !== undefined && tooSmall === false || tooSmall === undefined) { + if (imgs.length) { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__["onImagesLoaded"])(imgs, this._reflow.bind(this)); + } else { + this._reflow(); + } + } + } + + /** + * Removes event listeners if the breakpoint is too small. + * @private + */ + + }, { + key: '_pauseEvents', + value: function _pauseEvents() { + this.isOn = false; + this.$element.off({ + '.zf.equalizer': this._bindHandler.onPostEqualizedBound, + 'resizeme.zf.trigger': this._bindHandler.onResizeMeBound, + 'mutateme.zf.trigger': this._bindHandler.onResizeMeBound + }); + } + + /** + * function to handle $elements resizeme.zf.trigger, with bound this on _bindHandler.onResizeMeBound + * @private + */ + + }, { + key: '_onResizeMe', + value: function _onResizeMe(e) { + this._reflow(); + } + + /** + * function to handle $elements postequalized.zf.equalizer, with bound this on _bindHandler.onPostEqualizedBound + * @private + */ + + }, { + key: '_onPostEqualized', + value: function _onPostEqualized(e) { + if (e.target !== this.$element[0]) { + this._reflow(); + } + } + + /** + * Initializes events for Equalizer. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + this._pauseEvents(); + if (this.hasNested) { + this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound); + } else { + this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound); + this.$element.on('mutateme.zf.trigger', this._bindHandler.onResizeMeBound); + } + this.isOn = true; + } + + /** + * Checks the current breakpoint to the minimum required size. + * @private + */ + + }, { + key: '_checkMQ', + value: function _checkMQ() { + var tooSmall = !__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].is(this.options.equalizeOn); + if (tooSmall) { + if (this.isOn) { + this._pauseEvents(); + this.$watched.css('height', 'auto'); + } + } else { + if (!this.isOn) { + this._events(); + } + } + return tooSmall; + } + + /** + * A noop version for the plugin + * @private + */ + + }, { + key: '_killswitch', + value: function _killswitch() { + return; + } + + /** + * Calls necessary functions to update Equalizer upon DOM change + * @private + */ + + }, { + key: '_reflow', + value: function _reflow() { + if (!this.options.equalizeOnStack) { + if (this._isStacked()) { + this.$watched.css('height', 'auto'); + return false; + } + } + if (this.options.equalizeByRow) { + this.getHeightsByRow(this.applyHeightByRow.bind(this)); + } else { + this.getHeights(this.applyHeight.bind(this)); + } + } + + /** + * Manually determines if the first 2 elements are *NOT* stacked. + * @private + */ + + }, { + key: '_isStacked', + value: function _isStacked() { + if (!this.$watched[0] || !this.$watched[1]) { + return true; + } + return this.$watched[0].getBoundingClientRect().top !== this.$watched[1].getBoundingClientRect().top; + } + + /** + * Finds the outer heights of children contained within an Equalizer parent and returns them in an array + * @param {Function} cb - A non-optional callback to return the heights array to. + * @returns {Array} heights - An array of heights of children within Equalizer container + */ + + }, { + key: 'getHeights', + value: function getHeights(cb) { + var heights = []; + for (var i = 0, len = this.$watched.length; i < len; i++) { + this.$watched[i].style.height = 'auto'; + heights.push(this.$watched[i].offsetHeight); + } + cb(heights); + } + + /** + * Finds the outer heights of children contained within an Equalizer parent and returns them in an array + * @param {Function} cb - A non-optional callback to return the heights array to. + * @returns {Array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child + */ + + }, { + key: 'getHeightsByRow', + value: function getHeightsByRow(cb) { + var lastElTopOffset = this.$watched.length ? this.$watched.first().offset().top : 0, + groups = [], + group = 0; + //group by Row + groups[group] = []; + for (var i = 0, len = this.$watched.length; i < len; i++) { + this.$watched[i].style.height = 'auto'; + //maybe could use this.$watched[i].offsetTop + var elOffsetTop = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.$watched[i]).offset().top; + if (elOffsetTop != lastElTopOffset) { + group++; + groups[group] = []; + lastElTopOffset = elOffsetTop; + } + groups[group].push([this.$watched[i], this.$watched[i].offsetHeight]); + } + + for (var j = 0, ln = groups.length; j < ln; j++) { + var heights = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(groups[j]).map(function () { + return this[1]; + }).get(); + var max = Math.max.apply(null, heights); + groups[j].push(max); + } + cb(groups); + } + + /** + * Changes the CSS height property of each child in an Equalizer parent to match the tallest + * @param {array} heights - An array of heights of children within Equalizer container + * @fires Equalizer#preequalized + * @fires Equalizer#postequalized + */ + + }, { + key: 'applyHeight', + value: function applyHeight(heights) { + var max = Math.max.apply(null, heights); + /** + * Fires before the heights are applied + * @event Equalizer#preequalized + */ + this.$element.trigger('preequalized.zf.equalizer'); + + this.$watched.css('height', max); + + /** + * Fires when the heights have been applied + * @event Equalizer#postequalized + */ + this.$element.trigger('postequalized.zf.equalizer'); + } + + /** + * Changes the CSS height property of each child in an Equalizer parent to match the tallest by row + * @param {array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child + * @fires Equalizer#preequalized + * @fires Equalizer#preequalizedrow + * @fires Equalizer#postequalizedrow + * @fires Equalizer#postequalized + */ + + }, { + key: 'applyHeightByRow', + value: function applyHeightByRow(groups) { + /** + * Fires before the heights are applied + */ + this.$element.trigger('preequalized.zf.equalizer'); + for (var i = 0, len = groups.length; i < len; i++) { + var groupsILength = groups[i].length, + max = groups[i][groupsILength - 1]; + if (groupsILength <= 2) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(groups[i][0][0]).css({ 'height': 'auto' }); + continue; + } + /** + * Fires before the heights per row are applied + * @event Equalizer#preequalizedrow + */ + this.$element.trigger('preequalizedrow.zf.equalizer'); + for (var j = 0, lenJ = groupsILength - 1; j < lenJ; j++) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(groups[i][j][0]).css({ 'height': max }); + } + /** + * Fires when the heights per row have been applied + * @event Equalizer#postequalizedrow + */ + this.$element.trigger('postequalizedrow.zf.equalizer'); + } + /** + * Fires when the heights have been applied + */ + this.$element.trigger('postequalized.zf.equalizer'); + } + + /** + * Destroys an instance of Equalizer. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this._pauseEvents(); + this.$watched.css('height', 'auto'); + } + }]); + + return Equalizer; +}(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__["Plugin"]); + +/** + * Default settings for plugin + */ + + +Equalizer.defaults = { + /** + * Enable height equalization when stacked on smaller screens. + * @option + * @type {boolean} + * @default false + */ + equalizeOnStack: false, + /** + * Enable height equalization row by row. + * @option + * @type {boolean} + * @default false + */ + equalizeByRow: false, + /** + * String representing the minimum breakpoint size the plugin should equalize heights on. + * @option + * @type {string} + * @default '' + */ + equalizeOn: '' +}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 85: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(19); + + +/***/ }) + +/******/ }); +/******/ + (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 = 86); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 20: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_interchange__ = __webpack_require__(50); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_interchange__["a" /* Interchange */], 'Interchange'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 50: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Interchange; }); +/* 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_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__); + + +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; } + + + + + + +/** + * Interchange module. + * @module foundation.interchange + * @requires foundation.util.mediaQuery + */ + +var Interchange = function (_Plugin) { + _inherits(Interchange, _Plugin); + + function Interchange() { + _classCallCheck(this, Interchange); + + return _possibleConstructorReturn(this, (Interchange.__proto__ || Object.getPrototypeOf(Interchange)).apply(this, arguments)); + } + + _createClass(Interchange, [{ + key: '_setup', + + /** + * Creates a new instance of Interchange. + * @class + * @name Interchange + * @fires Interchange#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({}, Interchange.defaults, options); + this.rules = []; + this.currentPath = ''; + this.className = 'Interchange'; // ie9 back compat + + this._init(); + this._events(); + } + + /** + * Initializes the Interchange plugin and calls functions to get interchange functioning on load. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"]._init(); + + var id = this.$element[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["GetYoDigits"])(6, 'interchange'); + this.$element.attr({ + 'data-resize': id, + 'id': id + }); + + this._addBreakpoints(); + this._generateRules(); + this._reflow(); + } + + /** + * Initializes events for Interchange. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this3 = this; + + this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', function () { + return _this3._reflow(); + }); + } + + /** + * Calls necessary functions to update Interchange upon DOM change + * @function + * @private + */ + + }, { + key: '_reflow', + value: function _reflow() { + var match; + + // Iterate through each rule, but only save the last match + for (var i in this.rules) { + if (this.rules.hasOwnProperty(i)) { + var rule = this.rules[i]; + if (window.matchMedia(rule.query).matches) { + match = rule; + } + } + } + + if (match) { + this.replace(match.path); + } + } + + /** + * Gets the Foundation breakpoints and adds them to the Interchange.SPECIAL_QUERIES object. + * @function + * @private + */ + + }, { + key: '_addBreakpoints', + value: function _addBreakpoints() { + for (var i in __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].queries) { + if (__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].queries.hasOwnProperty(i)) { + var query = __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].queries[i]; + Interchange.SPECIAL_QUERIES[query.name] = query.value; + } + } + } + + /** + * Checks the Interchange element for the provided media query + content pairings + * @function + * @private + * @param {Object} element - jQuery object that is an Interchange instance + * @returns {Array} scenarios - Array of objects that have 'mq' and 'path' keys with corresponding keys + */ + + }, { + key: '_generateRules', + value: function _generateRules(element) { + var rulesList = []; + var rules; + + if (this.options.rules) { + rules = this.options.rules; + } else { + rules = this.$element.data('interchange'); + } + + rules = typeof rules === 'string' ? rules.match(/\[.*?\]/g) : rules; + + for (var i in rules) { + if (rules.hasOwnProperty(i)) { + var rule = rules[i].slice(1, -1).split(', '); + var path = rule.slice(0, -1).join(''); + var query = rule[rule.length - 1]; + + if (Interchange.SPECIAL_QUERIES[query]) { + query = Interchange.SPECIAL_QUERIES[query]; + } + + rulesList.push({ + path: path, + query: query + }); + } + } + + this.rules = rulesList; + } + + /** + * Update the `src` property of an image, or change the HTML of a container, to the specified path. + * @function + * @param {String} path - Path to the image or HTML partial. + * @fires Interchange#replaced + */ + + }, { + key: 'replace', + value: function replace(path) { + if (this.currentPath === path) return; + + var _this = this, + trigger = 'replaced.zf.interchange'; + + // Replacing images + if (this.$element[0].nodeName === 'IMG') { + this.$element.attr('src', path).on('load', function () { + _this.currentPath = path; + }).trigger(trigger); + } + // Replacing background images + else if (path.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)) { + path = path.replace(/\(/g, '%28').replace(/\)/g, '%29'); + this.$element.css({ 'background-image': 'url(' + path + ')' }).trigger(trigger); + } + // Replacing HTML + else { + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.get(path, function (response) { + _this.$element.html(response).trigger(trigger); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(response).foundation(); + _this.currentPath = path; + }); + } + + /** + * Fires when content in an Interchange element is done being loaded. + * @event Interchange#replaced + */ + // this.$element.trigger('replaced.zf.interchange'); + } + + /** + * Destroys an instance of interchange. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('resizeme.zf.trigger'); + } + }]); + + return Interchange; +}(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__["Plugin"]); + +/** + * Default settings for plugin + */ + + +Interchange.defaults = { + /** + * Rules to be applied to Interchange elements. Set with the `data-interchange` array notation. + * @option + * @type {?array} + * @default null + */ + rules: null +}; + +Interchange.SPECIAL_QUERIES = { + 'landscape': 'screen and (orientation: landscape)', + 'portrait': '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)' +}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 86: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(20); + + +/***/ }) + +/******/ }); +/******/ + (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 = 87); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 21: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_magellan__ = __webpack_require__(51); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_magellan__["a" /* Magellan */], 'Magellan'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 51: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Magellan; }); +/* 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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_smoothScroll__ = __webpack_require__(76); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_smoothScroll___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_smoothScroll__); + + +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; } + + + + + + +/** + * Magellan module. + * @module foundation.magellan + * @requires foundation.smoothScroll + */ + +var Magellan = function (_Plugin) { + _inherits(Magellan, _Plugin); + + function Magellan() { + _classCallCheck(this, Magellan); + + return _possibleConstructorReturn(this, (Magellan.__proto__ || Object.getPrototypeOf(Magellan)).apply(this, arguments)); + } + + _createClass(Magellan, [{ + key: '_setup', + + /** + * Creates a new instance of Magellan. + * @class + * @name Magellan + * @fires Magellan#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({}, Magellan.defaults, this.$element.data(), options); + this.className = 'Magellan'; // ie9 back compat + + this._init(); + this.calcPoints(); + } + + /** + * Initializes the Magellan plugin and calls functions to get equalizer functioning on load. + * @private + */ + + }, { + key: '_init', + value: function _init() { + var id = this.$element[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["GetYoDigits"])(6, 'magellan'); + var _this = this; + this.$targets = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-magellan-target]'); + this.$links = this.$element.find('a'); + this.$element.attr({ + 'data-resize': id, + 'data-scroll': id, + 'id': id + }); + this.$active = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(); + this.scrollPos = parseInt(window.pageYOffset, 10); + + this._events(); + } + + /** + * Calculates an array of pixel values that are the demarcation lines between locations on the page. + * Can be invoked if new elements are added or the size of a location changes. + * @function + */ + + }, { + key: 'calcPoints', + value: function calcPoints() { + var _this = this, + body = document.body, + html = document.documentElement; + + this.points = []; + this.winHeight = Math.round(Math.max(window.innerHeight, html.clientHeight)); + this.docHeight = Math.round(Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight)); + + this.$targets.each(function () { + var $tar = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), + pt = Math.round($tar.offset().top - _this.options.threshold); + $tar.targetPoint = pt; + _this.points.push(pt); + }); + } + + /** + * Initializes events for Magellan. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this, + $body = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body'), + opts = { + duration: _this.options.animationDuration, + easing: _this.options.animationEasing + }; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).one('load', function () { + if (_this.options.deepLinking) { + if (location.hash) { + _this.scrollToLoc(location.hash); + } + } + _this.calcPoints(); + _this._updateActive(); + }); + + this.$element.on({ + 'resizeme.zf.trigger': this.reflow.bind(this), + 'scrollme.zf.trigger': this._updateActive.bind(this) + }).on('click.zf.magellan', 'a[href^="#"]', function (e) { + e.preventDefault(); + var arrival = this.getAttribute('href'); + _this.scrollToLoc(arrival); + }); + + this._deepLinkScroll = function (e) { + if (_this.options.deepLinking) { + _this.scrollToLoc(window.location.hash); + } + }; + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('popstate', this._deepLinkScroll); + } + + /** + * Function to scroll to a given location on the page. + * @param {String} loc - a properly formatted jQuery id selector. Example: '#foo' + * @function + */ + + }, { + key: 'scrollToLoc', + value: function scrollToLoc(loc) { + this._inTransition = true; + var _this = this; + + var options = { + animationEasing: this.options.animationEasing, + animationDuration: this.options.animationDuration, + threshold: this.options.threshold, + offset: this.options.offset + }; + + __WEBPACK_IMPORTED_MODULE_3__foundation_smoothScroll__["SmoothScroll"].scrollToLoc(loc, options, function () { + _this._inTransition = false; + _this._updateActive(); + }); + } + + /** + * Calls necessary functions to update Magellan upon DOM change + * @function + */ + + }, { + key: 'reflow', + value: function reflow() { + this.calcPoints(); + this._updateActive(); + } + + /** + * Updates the visibility of an active location link, and updates the url hash for the page, if deepLinking enabled. + * @private + * @function + * @fires Magellan#update + */ + + }, { + key: '_updateActive', + value: function _updateActive() /*evt, elem, scrollPos*/{ + if (this._inTransition) { + return; + } + var winPos = /*scrollPos ||*/parseInt(window.pageYOffset, 10), + curIdx; + + if (winPos + this.winHeight === this.docHeight) { + curIdx = this.points.length - 1; + } else if (winPos < this.points[0]) { + curIdx = undefined; + } else { + var isDown = this.scrollPos < winPos, + _this = this, + curVisible = this.points.filter(function (p, i) { + return isDown ? p - _this.options.offset <= winPos : p - _this.options.offset - _this.options.threshold <= winPos; + }); + curIdx = curVisible.length ? curVisible.length - 1 : 0; + } + + this.$active.removeClass(this.options.activeClass); + this.$active = this.$links.filter('[href="#' + this.$targets.eq(curIdx).data('magellan-target') + '"]').addClass(this.options.activeClass); + + if (this.options.deepLinking) { + var hash = ""; + if (curIdx != undefined) { + hash = this.$active[0].getAttribute('href'); + } + if (hash !== window.location.hash) { + if (window.history.pushState) { + window.history.pushState(null, null, hash); + } else { + window.location.hash = hash; + } + } + } + + this.scrollPos = winPos; + /** + * Fires when magellan is finished updating to the new active element. + * @event Magellan#update + */ + this.$element.trigger('update.zf.magellan', [this.$active]); + } + + /** + * Destroys an instance of Magellan and resets the url of the window. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('.zf.trigger .zf.magellan').find('.' + this.options.activeClass).removeClass(this.options.activeClass); + + if (this.options.deepLinking) { + var hash = this.$active[0].getAttribute('href'); + window.location.hash.replace(hash, ''); + } + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('popstate', this._deepLinkScroll); + } + }]); + + return Magellan; +}(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__["Plugin"]); + +/** + * Default settings for plugin + */ + + +Magellan.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, + /** + * Class applied to the active locations link on the magellan container. + * @option + * @type {string} + * @default 'is-active' + */ + activeClass: 'is-active', + /** + * Allows the script to manipulate the url of the current page, and if supported, alter the history. + * @option + * @type {boolean} + * @default false + */ + deepLinking: false, + /** + * 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 +}; + + + +/***/ }), + +/***/ 76: +/***/ (function(module, exports) { + +module.exports = {SmoothScroll: window.Foundation.SmoothScroll}; + +/***/ }), + +/***/ 87: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(21); + + +/***/ }) + +/******/ }); +/******/ + (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 = 88); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 22: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_offcanvas__ = __webpack_require__(52); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_offcanvas__["a" /* OffCanvas */], 'OffCanvas'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 52: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return OffCanvas; }); +/* 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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_triggers__ = __webpack_require__(7); + + +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; } + + + + + + + + + +/** + * OffCanvas module. + * @module foundation.offcanvas + * @requires foundation.util.keyboard + * @requires foundation.util.mediaQuery + * @requires foundation.util.triggers + */ + +var OffCanvas = function (_Plugin) { + _inherits(OffCanvas, _Plugin); + + function OffCanvas() { + _classCallCheck(this, OffCanvas); + + return _possibleConstructorReturn(this, (OffCanvas.__proto__ || Object.getPrototypeOf(OffCanvas)).apply(this, arguments)); + } + + _createClass(OffCanvas, [{ + key: '_setup', + + /** + * Creates a new instance of an off-canvas wrapper. + * @class + * @name OffCanvas + * @fires OffCanvas#init + * @param {Object} element - jQuery object to initialize. + * @param {Object} options - Overrides to the default plugin settings. + */ + value: function _setup(element, options) { + var _this3 = this; + + this.className = 'OffCanvas'; // ie9 back compat + this.$element = element; + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, OffCanvas.defaults, this.$element.data(), options); + this.contentClasses = { base: [], reveal: [] }; + this.$lastTrigger = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(); + this.$triggers = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(); + this.position = 'left'; + this.$content = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(); + this.nested = !!this.options.nested; + + // Defines the CSS transition/position classes of the off-canvas content container. + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(['push', 'overlap']).each(function (index, val) { + _this3.contentClasses.base.push('has-transition-' + val); + }); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(['left', 'right', 'top', 'bottom']).each(function (index, val) { + _this3.contentClasses.base.push('has-position-' + val); + _this3.contentClasses.reveal.push('has-reveal-' + val); + }); + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_5__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"]._init(); + + this._init(); + this._events(); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].register('OffCanvas', { + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the off-canvas wrapper by adding the exit overlay (if needed). + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + var id = this.$element.attr('id'); + + this.$element.attr('aria-hidden', 'true'); + + // Find off-canvas content, either by ID (if specified), by siblings or by closest selector (fallback) + if (this.options.contentId) { + this.$content = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + this.options.contentId); + } else if (this.$element.siblings('[data-off-canvas-content]').length) { + this.$content = this.$element.siblings('[data-off-canvas-content]').first(); + } else { + this.$content = this.$element.closest('[data-off-canvas-content]').first(); + } + + if (!this.options.contentId) { + // Assume that the off-canvas element is nested if it isn't a sibling of the content + this.nested = this.$element.siblings('[data-off-canvas-content]').length === 0; + } else if (this.options.contentId && this.options.nested === null) { + // Warning if using content ID without setting the nested option + // Once the element is nested it is required to work properly in this case + console.warn('Remember to use the nested option if using the content ID option!'); + } + + if (this.nested === true) { + // Force transition overlap if nested + this.options.transition = 'overlap'; + // Remove appropriate classes if already assigned in markup + this.$element.removeClass('is-transition-push'); + } + + this.$element.addClass('is-transition-' + this.options.transition + ' is-closed'); + + // Find triggers that affect this element and add aria-expanded to them + this.$triggers = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document).find('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-expanded', 'false').attr('aria-controls', id); + + // Get position by checking for related CSS class + this.position = this.$element.is('.position-left, .position-top, .position-right, .position-bottom') ? this.$element.attr('class').match(/position\-(left|top|right|bottom)/)[1] : this.position; + + // Add an overlay over the content if necessary + if (this.options.contentOverlay === true) { + var overlay = document.createElement('div'); + var overlayPosition = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.$element).css("position") === 'fixed' ? 'is-overlay-fixed' : 'is-overlay-absolute'; + overlay.setAttribute('class', 'js-off-canvas-overlay ' + overlayPosition); + this.$overlay = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(overlay); + if (overlayPosition === 'is-overlay-fixed') { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.$overlay).insertAfter(this.$element); + } else { + this.$content.append(this.$overlay); + } + } + + this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className); + + if (this.options.isRevealed === true) { + this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2]; + this._setMQChecker(); + } + + if (this.options.transitionTime) { + this.$element.css('transition-duration', this.options.transitionTime); + } + + // Initally remove all transition/position CSS classes from off-canvas content container. + this._removeContentClasses(); + } + + /** + * Adds event handlers to the off-canvas wrapper and the exit overlay. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this.$element.off('.zf.trigger .zf.offcanvas').on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': this.close.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this), + 'keydown.zf.offcanvas': this._handleKeyboard.bind(this) + }); + + if (this.options.closeOnClick === true) { + var $target = this.options.contentOverlay ? this.$overlay : this.$content; + $target.on({ 'click.zf.offcanvas': this.close.bind(this) }); + } + } + + /** + * Applies event listener for elements that will reveal at certain breakpoints. + * @private + */ + + }, { + key: '_setMQChecker', + value: function _setMQChecker() { + var _this = this; + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', function () { + if (__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].atLeast(_this.options.revealOn)) { + _this.reveal(true); + } else { + _this.reveal(false); + } + }).one('load.zf.offcanvas', function () { + if (__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].atLeast(_this.options.revealOn)) { + _this.reveal(true); + } + }); + } + + /** + * Removes the CSS transition/position classes of the off-canvas content container. + * Removing the classes is important when another off-canvas gets opened that uses the same content container. + * @private + */ + + }, { + key: '_removeContentClasses', + value: function _removeContentClasses(hasReveal) { + this.$content.removeClass(this.contentClasses.base.join(' ')); + if (hasReveal === true) { + this.$content.removeClass(this.contentClasses.reveal.join(' ')); + } + } + + /** + * Adds the CSS transition/position classes of the off-canvas content container, based on the opening off-canvas element. + * Beforehand any transition/position class gets removed. + * @param {Boolean} hasReveal - true if related off-canvas element is revealed. + * @private + */ + + }, { + key: '_addContentClasses', + value: function _addContentClasses(hasReveal) { + this._removeContentClasses(); + this.$content.addClass('has-transition-' + this.options.transition + ' has-position-' + this.position); + if (hasReveal === true) { + this.$content.addClass('has-reveal-' + this.position); + } + } + + /** + * Handles the revealing/hiding the off-canvas at breakpoints, not the same as open. + * @param {Boolean} isRevealed - true if element should be revealed. + * @function + */ + + }, { + key: 'reveal', + value: function reveal(isRevealed) { + if (isRevealed) { + this.close(); + this.isRevealed = true; + this.$element.attr('aria-hidden', 'false'); + this.$element.off('open.zf.trigger toggle.zf.trigger'); + this.$element.removeClass('is-closed'); + } else { + this.isRevealed = false; + this.$element.attr('aria-hidden', 'true'); + this.$element.off('open.zf.trigger toggle.zf.trigger').on({ + 'open.zf.trigger': this.open.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this) + }); + this.$element.addClass('is-closed'); + } + this._addContentClasses(isRevealed); + } + + /** + * Stops scrolling of the body when offcanvas is open on mobile Safari and other troublesome browsers. + * @private + */ + + }, { + key: '_stopScrolling', + value: function _stopScrolling(event) { + return false; + } + + // Taken and adapted from http://stackoverflow.com/questions/16889447/prevent-full-page-scrolling-ios + // Only really works for y, not sure how to extend to x or if we need to. + + }, { + key: '_recordScrollable', + value: function _recordScrollable(event) { + var elem = this; // called from event handler context with this as elem + + // If the element is scrollable (content overflows), then... + if (elem.scrollHeight !== elem.clientHeight) { + // If we're at the top, scroll down one pixel to allow scrolling up + if (elem.scrollTop === 0) { + elem.scrollTop = 1; + } + // If we're at the bottom, scroll up one pixel to allow scrolling down + if (elem.scrollTop === elem.scrollHeight - elem.clientHeight) { + elem.scrollTop = elem.scrollHeight - elem.clientHeight - 1; + } + } + elem.allowUp = elem.scrollTop > 0; + elem.allowDown = elem.scrollTop < elem.scrollHeight - elem.clientHeight; + elem.lastY = event.originalEvent.pageY; + } + }, { + key: '_stopScrollPropagation', + value: function _stopScrollPropagation(event) { + var elem = this; // called from event handler context with this as elem + var up = event.pageY < elem.lastY; + var down = !up; + elem.lastY = event.pageY; + + if (up && elem.allowUp || down && elem.allowDown) { + event.stopPropagation(); + } else { + event.preventDefault(); + } + } + + /** + * Opens the off-canvas menu. + * @function + * @param {Object} event - Event object passed from listener. + * @param {jQuery} trigger - element that triggered the off-canvas to open. + * @fires OffCanvas#opened + */ + + }, { + key: 'open', + value: function open(event, trigger) { + if (this.$element.hasClass('is-open') || this.isRevealed) { + return; + } + var _this = this; + + if (trigger) { + this.$lastTrigger = trigger; + } + + if (this.options.forceTo === 'top') { + window.scrollTo(0, 0); + } else if (this.options.forceTo === 'bottom') { + window.scrollTo(0, document.body.scrollHeight); + } + + if (this.options.transitionTime && this.options.transition !== 'overlap') { + this.$element.siblings('[data-off-canvas-content]').css('transition-duration', this.options.transitionTime); + } else { + this.$element.siblings('[data-off-canvas-content]').css('transition-duration', ''); + } + + /** + * Fires when the off-canvas menu opens. + * @event OffCanvas#opened + */ + this.$element.addClass('is-open').removeClass('is-closed'); + + this.$triggers.attr('aria-expanded', 'true'); + this.$element.attr('aria-hidden', 'false').trigger('opened.zf.offcanvas'); + + this.$content.addClass('is-open-' + this.position); + + // If `contentScroll` is set to false, add class and disable scrolling on touch devices. + if (this.options.contentScroll === false) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').addClass('is-off-canvas-open').on('touchmove', this._stopScrolling); + this.$element.on('touchstart', this._recordScrollable); + this.$element.on('touchmove', this._stopScrollPropagation); + } + + if (this.options.contentOverlay === true) { + this.$overlay.addClass('is-visible'); + } + + if (this.options.closeOnClick === true && this.options.contentOverlay === true) { + this.$overlay.addClass('is-closable'); + } + + if (this.options.autoFocus === true) { + this.$element.one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["transitionend"])(this.$element), function () { + if (!_this.$element.hasClass('is-open')) { + return; // exit if prematurely closed + } + var canvasFocus = _this.$element.find('[data-autofocus]'); + if (canvasFocus.length) { + canvasFocus.eq(0).focus(); + } else { + _this.$element.find('a, button').eq(0).focus(); + } + }); + } + + if (this.options.trapFocus === true) { + this.$content.attr('tabindex', '-1'); + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].trapFocus(this.$element); + } + + this._addContentClasses(); + } + + /** + * Closes the off-canvas menu. + * @function + * @param {Function} cb - optional cb to fire after closure. + * @fires OffCanvas#closed + */ + + }, { + key: 'close', + value: function close(cb) { + if (!this.$element.hasClass('is-open') || this.isRevealed) { + return; + } + + var _this = this; + + this.$element.removeClass('is-open'); + + this.$element.attr('aria-hidden', 'true') + /** + * Fires when the off-canvas menu opens. + * @event OffCanvas#closed + */ + .trigger('closed.zf.offcanvas'); + + this.$content.removeClass('is-open-left is-open-top is-open-right is-open-bottom'); + + // If `contentScroll` is set to false, remove class and re-enable scrolling on touch devices. + if (this.options.contentScroll === false) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').removeClass('is-off-canvas-open').off('touchmove', this._stopScrolling); + this.$element.off('touchstart', this._recordScrollable); + this.$element.off('touchmove', this._stopScrollPropagation); + } + + if (this.options.contentOverlay === true) { + this.$overlay.removeClass('is-visible'); + } + + if (this.options.closeOnClick === true && this.options.contentOverlay === true) { + this.$overlay.removeClass('is-closable'); + } + + this.$triggers.attr('aria-expanded', 'false'); + + if (this.options.trapFocus === true) { + this.$content.removeAttr('tabindex'); + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].releaseFocus(this.$element); + } + + // Listen to transitionEnd and add class when done. + this.$element.one(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["transitionend"])(this.$element), function (e) { + _this.$element.addClass('is-closed'); + _this._removeContentClasses(); + }); + } + + /** + * Toggles the off-canvas menu open or closed. + * @function + * @param {Object} event - Event object passed from listener. + * @param {jQuery} trigger - element that triggered the off-canvas to open. + */ + + }, { + key: 'toggle', + value: function toggle(event, trigger) { + if (this.$element.hasClass('is-open')) { + this.close(event, trigger); + } else { + this.open(event, trigger); + } + } + + /** + * Handles keyboard input when detected. When the escape key is pressed, the off-canvas menu closes, and focus is restored to the element that opened the menu. + * @function + * @private + */ + + }, { + key: '_handleKeyboard', + value: function _handleKeyboard(e) { + var _this4 = this; + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].handleKey(e, 'OffCanvas', { + close: function () { + _this4.close(); + _this4.$lastTrigger.focus(); + return true; + }, + handled: function () { + e.stopPropagation(); + e.preventDefault(); + } + }); + } + + /** + * Destroys the offcanvas plugin. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.close(); + this.$element.off('.zf.trigger .zf.offcanvas'); + this.$overlay.off('.zf.offcanvas'); + } + }]); + + return OffCanvas; +}(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__["Plugin"]); + +OffCanvas.defaults = { + /** + * Allow the user to click outside of the menu to close it. + * @option + * @type {boolean} + * @default true + */ + closeOnClick: true, + + /** + * Adds an overlay on top of `[data-off-canvas-content]`. + * @option + * @type {boolean} + * @default true + */ + contentOverlay: true, + + /** + * Target an off-canvas content container by ID that may be placed anywhere. If null the closest content container will be taken. + * @option + * @type {?string} + * @default null + */ + contentId: null, + + /** + * Define the off-canvas element is nested in an off-canvas content. This is required when using the contentId option for a nested element. + * @option + * @type {boolean} + * @default null + */ + nested: null, + + /** + * Enable/disable scrolling of the main content when an off canvas panel is open. + * @option + * @type {boolean} + * @default true + */ + contentScroll: true, + + /** + * Amount of time in ms the open and close transition requires. If none selected, pulls from body style. + * @option + * @type {number} + * @default null + */ + transitionTime: null, + + /** + * Type of transition for the offcanvas menu. Options are 'push', 'detached' or 'slide'. + * @option + * @type {string} + * @default push + */ + transition: 'push', + + /** + * Force the page to scroll to top or bottom on open. + * @option + * @type {?string} + * @default null + */ + forceTo: null, + + /** + * Allow the offcanvas to remain open for certain breakpoints. + * @option + * @type {boolean} + * @default false + */ + isRevealed: false, + + /** + * Breakpoint at which to reveal. JS will use a RegExp to target standard classes, if changing classnames, pass your class with the `revealClass` option. + * @option + * @type {?string} + * @default null + */ + revealOn: null, + + /** + * Force focus to the offcanvas on open. If true, will focus the opening trigger on close. + * @option + * @type {boolean} + * @default true + */ + autoFocus: true, + + /** + * Class used to force an offcanvas to remain open. Foundation defaults for this are `reveal-for-large` & `reveal-for-medium`. + * @option + * @type {string} + * @default reveal-for- + * @todo improve the regex testing for this. + */ + revealClass: 'reveal-for-', + + /** + * Triggers optional focus trapping when opening an offcanvas. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes. + * @option + * @type {boolean} + * @default false + */ + trapFocus: false +}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 88: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(22); + + +/***/ }) + +/******/ }); +/******/ + (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 = 89); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 10: +/***/ (function(module, exports) { + +module.exports = {onImagesLoaded: window.Foundation.onImagesLoaded}; + +/***/ }), + +/***/ 12: +/***/ (function(module, exports) { + +module.exports = {Touch: window.Foundation.Touch}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 23: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_orbit__ = __webpack_require__(53); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_orbit__["a" /* Orbit */], 'Orbit'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 53: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Orbit; }); +/* 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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__ = __webpack_require__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_timer__ = __webpack_require__(78); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_timer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_timer__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_imageLoader__ = __webpack_require__(10); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_imageLoader___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_util_imageLoader__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__foundation_util_touch__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__foundation_util_touch___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7__foundation_util_touch__); + + +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; } + + + + + + + + + + +/** + * Orbit module. + * @module foundation.orbit + * @requires foundation.util.keyboard + * @requires foundation.util.motion + * @requires foundation.util.timer + * @requires foundation.util.imageLoader + * @requires foundation.util.touch + */ + +var Orbit = function (_Plugin) { + _inherits(Orbit, _Plugin); + + function Orbit() { + _classCallCheck(this, Orbit); + + return _possibleConstructorReturn(this, (Orbit.__proto__ || Object.getPrototypeOf(Orbit)).apply(this, arguments)); + } + + _createClass(Orbit, [{ + key: '_setup', + + /** + * Creates a new instance of an orbit carousel. + * @class + * @name Orbit + * @param {jQuery} element - jQuery object to make into an Orbit Carousel. + * @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({}, Orbit.defaults, this.$element.data(), options); + this.className = 'Orbit'; // ie9 back compat + + __WEBPACK_IMPORTED_MODULE_7__foundation_util_touch__["Touch"].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); // Touch init is idempotent, we just need to make sure it's initialied. + + this._init(); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].register('Orbit', { + 'ltr': { + 'ARROW_RIGHT': 'next', + 'ARROW_LEFT': 'previous' + }, + 'rtl': { + 'ARROW_LEFT': 'next', + 'ARROW_RIGHT': 'previous' + } + }); + } + + /** + * Initializes the plugin by creating jQuery collections, setting attributes, and starting the animation. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + // @TODO: consider discussion on PR #9278 about DOM pollution by changeSlide + this._reset(); + + this.$wrapper = this.$element.find('.' + this.options.containerClass); + this.$slides = this.$element.find('.' + this.options.slideClass); + + var $images = this.$element.find('img'), + initActive = this.$slides.filter('.is-active'), + id = this.$element[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__foundation_util_core__["GetYoDigits"])(6, 'orbit'); + + this.$element.attr({ + 'data-resize': id, + 'id': id + }); + + if (!initActive.length) { + this.$slides.eq(0).addClass('is-active'); + } + + if (!this.options.useMUI) { + this.$slides.addClass('no-motionui'); + } + + if ($images.length) { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__foundation_util_imageLoader__["onImagesLoaded"])($images, this._prepareForOrbit.bind(this)); + } else { + this._prepareForOrbit(); //hehe + } + + if (this.options.bullets) { + this._loadBullets(); + } + + this._events(); + + if (this.options.autoPlay && this.$slides.length > 1) { + this.geoSync(); + } + + if (this.options.accessible) { + // allow wrapper to be focusable to enable arrow navigation + this.$wrapper.attr('tabindex', 0); + } + } + + /** + * Creates a jQuery collection of bullets, if they are being used. + * @function + * @private + */ + + }, { + key: '_loadBullets', + value: function _loadBullets() { + this.$bullets = this.$element.find('.' + this.options.boxOfBullets).find('button'); + } + + /** + * Sets a `timer` object on the orbit, and starts the counter for the next slide. + * @function + */ + + }, { + key: 'geoSync', + value: function geoSync() { + var _this = this; + this.timer = new __WEBPACK_IMPORTED_MODULE_3__foundation_util_timer__["Timer"](this.$element, { + duration: this.options.timerDelay, + infinite: false + }, function () { + _this.changeSlide(true); + }); + this.timer.start(); + } + + /** + * Sets wrapper and slide heights for the orbit. + * @function + * @private + */ + + }, { + key: '_prepareForOrbit', + value: function _prepareForOrbit() { + var _this = this; + this._setWrapperHeight(); + } + + /** + * Calulates the height of each slide in the collection, and uses the tallest one for the wrapper height. + * @function + * @private + * @param {Function} cb - a callback function to fire when complete. + */ + + }, { + key: '_setWrapperHeight', + value: function _setWrapperHeight(cb) { + //rewrite this to `for` loop + var max = 0, + temp, + counter = 0, + _this = this; + + this.$slides.each(function () { + temp = this.getBoundingClientRect().height; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).attr('data-slide', counter); + + if (_this.$slides.filter('.is-active')[0] !== _this.$slides.eq(counter)[0]) { + //if not the active slide, set css position and display property + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).css({ 'position': 'relative', 'display': 'none' }); + } + max = temp > max ? temp : max; + counter++; + }); + + if (counter === this.$slides.length) { + this.$wrapper.css({ 'height': max }); //only change the wrapper height property once. + if (cb) { + cb(max); + } //fire callback with max height dimension. + } + } + + /** + * Sets the max-height of each slide. + * @function + * @private + */ + + }, { + key: '_setSlideHeight', + value: function _setSlideHeight(height) { + this.$slides.each(function () { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).css('max-height', height); + }); + } + + /** + * Adds event listeners to basically everything within the element. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + //*************************************** + //**Now using custom event - thanks to:** + //** Yohai Ararat of Toronto ** + //*************************************** + // + this.$element.off('.resizeme.zf.trigger').on({ + 'resizeme.zf.trigger': this._prepareForOrbit.bind(this) + }); + if (this.$slides.length > 1) { + + if (this.options.swipe) { + this.$slides.off('swipeleft.zf.orbit swiperight.zf.orbit').on('swipeleft.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide(true); + }).on('swiperight.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide(false); + }); + } + //*************************************** + + if (this.options.autoPlay) { + this.$slides.on('click.zf.orbit', function () { + _this.$element.data('clickedOn', _this.$element.data('clickedOn') ? false : true); + _this.timer[_this.$element.data('clickedOn') ? 'pause' : 'start'](); + }); + + if (this.options.pauseOnHover) { + this.$element.on('mouseenter.zf.orbit', function () { + _this.timer.pause(); + }).on('mouseleave.zf.orbit', function () { + if (!_this.$element.data('clickedOn')) { + _this.timer.start(); + } + }); + } + } + + if (this.options.navButtons) { + var $controls = this.$element.find('.' + this.options.nextClass + ', .' + this.options.prevClass); + $controls.attr('tabindex', 0) + //also need to handle enter/return and spacebar key presses + .on('click.zf.orbit touchend.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).hasClass(_this.options.nextClass)); + }); + } + + if (this.options.bullets) { + this.$bullets.on('click.zf.orbit touchend.zf.orbit', function () { + if (/is-active/g.test(this.className)) { + return false; + } //if this is active, kick out of function. + var idx = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('slide'), + ltr = idx > _this.$slides.filter('.is-active').data('slide'), + $slide = _this.$slides.eq(idx); + + _this.changeSlide(ltr, $slide, idx); + }); + } + + if (this.options.accessible) { + this.$wrapper.add(this.$bullets).on('keydown.zf.orbit', function (e) { + // handle keyboard event with keyboard util + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].handleKey(e, 'Orbit', { + next: function () { + _this.changeSlide(true); + }, + previous: function () { + _this.changeSlide(false); + }, + handled: function () { + // if bullet is focused, make sure focus moves + if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target).is(_this.$bullets)) { + _this.$bullets.filter('.is-active').focus(); + } + } + }); + }); + } + } + } + + /** + * Resets Orbit so it can be reinitialized + */ + + }, { + key: '_reset', + value: function _reset() { + // Don't do anything if there are no slides (first run) + if (typeof this.$slides == 'undefined') { + return; + } + + if (this.$slides.length > 1) { + // Remove old events + this.$element.off('.zf.orbit').find('*').off('.zf.orbit'); + + // Restart timer if autoPlay is enabled + if (this.options.autoPlay) { + this.timer.restart(); + } + + // Reset all sliddes + this.$slides.each(function (el) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(el).removeClass('is-active is-active is-in').removeAttr('aria-live').hide(); + }); + + // Show the first slide + this.$slides.first().addClass('is-active').show(); + + // Triggers when the slide has finished animating + this.$element.trigger('slidechange.zf.orbit', [this.$slides.first()]); + + // Select first bullet if bullets are present + if (this.options.bullets) { + this._updateBullets(0); + } + } + } + + /** + * Changes the current slide to a new one. + * @function + * @param {Boolean} isLTR - flag if the slide should move left to right. + * @param {jQuery} chosenSlide - the jQuery element of the slide to show next, if one is selected. + * @param {Number} idx - the index of the new slide in its collection, if one chosen. + * @fires Orbit#slidechange + */ + + }, { + key: 'changeSlide', + value: function changeSlide(isLTR, chosenSlide, idx) { + if (!this.$slides) { + return; + } // Don't freak out if we're in the middle of cleanup + var $curSlide = this.$slides.filter('.is-active').eq(0); + + if (/mui/g.test($curSlide[0].className)) { + return false; + } //if the slide is currently animating, kick out of the function + + var $firstSlide = this.$slides.first(), + $lastSlide = this.$slides.last(), + dirIn = isLTR ? 'Right' : 'Left', + dirOut = isLTR ? 'Left' : 'Right', + _this = this, + $newSlide; + + if (!chosenSlide) { + //most of the time, this will be auto played or clicked from the navButtons. + $newSlide = isLTR ? //if wrapping enabled, check to see if there is a `next` or `prev` sibling, if not, select the first or last slide to fill in. if wrapping not enabled, attempt to select `next` or `prev`, if there's nothing there, the function will kick out on next step. CRAZY NESTED TERNARIES!!!!! + this.options.infiniteWrap ? $curSlide.next('.' + this.options.slideClass).length ? $curSlide.next('.' + this.options.slideClass) : $firstSlide : $curSlide.next('.' + this.options.slideClass) : //pick next slide if moving left to right + this.options.infiniteWrap ? $curSlide.prev('.' + this.options.slideClass).length ? $curSlide.prev('.' + this.options.slideClass) : $lastSlide : $curSlide.prev('.' + this.options.slideClass); //pick prev slide if moving right to left + } else { + $newSlide = chosenSlide; + } + + if ($newSlide.length) { + /** + * Triggers before the next slide starts animating in and only if a next slide has been found. + * @event Orbit#beforeslidechange + */ + this.$element.trigger('beforeslidechange.zf.orbit', [$curSlide, $newSlide]); + + if (this.options.bullets) { + idx = idx || this.$slides.index($newSlide); //grab index to update bullets + this._updateBullets(idx); + } + + if (this.options.useMUI && !this.$element.is(':hidden')) { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__["Motion"].animateIn($newSlide.addClass('is-active').css({ 'position': 'absolute', 'top': 0 }), this.options['animInFrom' + dirIn], function () { + $newSlide.css({ 'position': 'relative', 'display': 'block' }).attr('aria-live', 'polite'); + }); + + __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__["Motion"].animateOut($curSlide.removeClass('is-active'), this.options['animOutTo' + dirOut], function () { + $curSlide.removeAttr('aria-live'); + if (_this.options.autoPlay && !_this.timer.isPaused) { + _this.timer.restart(); + } + //do stuff? + }); + } else { + $curSlide.removeClass('is-active is-in').removeAttr('aria-live').hide(); + $newSlide.addClass('is-active is-in').attr('aria-live', 'polite').show(); + if (this.options.autoPlay && !this.timer.isPaused) { + this.timer.restart(); + } + } + /** + * Triggers when the slide has finished animating in. + * @event Orbit#slidechange + */ + this.$element.trigger('slidechange.zf.orbit', [$newSlide]); + } + } + + /** + * Updates the active state of the bullets, if displayed. + * @function + * @private + * @param {Number} idx - the index of the current slide. + */ + + }, { + key: '_updateBullets', + value: function _updateBullets(idx) { + var $oldBullet = this.$element.find('.' + this.options.boxOfBullets).find('.is-active').removeClass('is-active').blur(), + span = $oldBullet.find('span:last').detach(), + $newBullet = this.$bullets.eq(idx).addClass('is-active').append(span); + } + + /** + * Destroys the carousel and hides the element. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('.zf.orbit').find('*').off('.zf.orbit').end().hide(); + } + }]); + + return Orbit; +}(__WEBPACK_IMPORTED_MODULE_6__foundation_plugin__["Plugin"]); + +Orbit.defaults = { + /** + * Tells the JS to look for and loadBullets. + * @option + * @type {boolean} + * @default true + */ + bullets: true, + /** + * Tells the JS to apply event listeners to nav buttons + * @option + * @type {boolean} + * @default true + */ + navButtons: true, + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-in-right' + */ + animInFromRight: 'slide-in-right', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-out-right' + */ + animOutToRight: 'slide-out-right', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-in-left' + * + */ + animInFromLeft: 'slide-in-left', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-out-left' + */ + animOutToLeft: 'slide-out-left', + /** + * Allows Orbit to automatically animate on page load. + * @option + * @type {boolean} + * @default true + */ + autoPlay: true, + /** + * Amount of time, in ms, between slide transitions + * @option + * @type {number} + * @default 5000 + */ + timerDelay: 5000, + /** + * Allows Orbit to infinitely loop through the slides + * @option + * @type {boolean} + * @default true + */ + infiniteWrap: true, + /** + * Allows the Orbit slides to bind to swipe events for mobile, requires an additional util library + * @option + * @type {boolean} + * @default true + */ + swipe: true, + /** + * Allows the timing function to pause animation on hover. + * @option + * @type {boolean} + * @default true + */ + pauseOnHover: true, + /** + * Allows Orbit to bind keyboard events to the slider, to animate frames with arrow keys + * @option + * @type {boolean} + * @default true + */ + accessible: true, + /** + * Class applied to the container of Orbit + * @option + * @type {string} + * @default 'orbit-container' + */ + containerClass: 'orbit-container', + /** + * Class applied to individual slides. + * @option + * @type {string} + * @default 'orbit-slide' + */ + slideClass: 'orbit-slide', + /** + * Class applied to the bullet container. You're welcome. + * @option + * @type {string} + * @default 'orbit-bullets' + */ + boxOfBullets: 'orbit-bullets', + /** + * Class applied to the `next` navigation button. + * @option + * @type {string} + * @default 'orbit-next' + */ + nextClass: 'orbit-next', + /** + * Class applied to the `previous` navigation button. + * @option + * @type {string} + * @default 'orbit-previous' + */ + prevClass: 'orbit-previous', + /** + * Boolean to flag the js to use motion ui classes or not. Default to true for backwards compatability. + * @option + * @type {boolean} + * @default true + */ + useMUI: true +}; + + + +/***/ }), + +/***/ 78: +/***/ (function(module, exports) { + +module.exports = {Timer: window.Foundation.Timer}; + +/***/ }), + +/***/ 89: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(23); + + +/***/ }) + +/******/ }); +/******/ + (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 = 90); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 24: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_responsiveAccordionTabs__ = __webpack_require__(54); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_responsiveAccordionTabs__["a" /* ResponsiveAccordionTabs */], 'ResponsiveAccordionTabs'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 54: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ResponsiveAccordionTabs; }); +/* 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_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_accordion__ = __webpack_require__(72); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_accordion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_accordion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_tabs__ = __webpack_require__(77); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_tabs___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__foundation_tabs__); + + +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; } + + + + + + + + + +// The plugin matches the plugin classes with these plugin instances. +var MenuPlugins = { + tabs: { + cssClass: 'tabs', + plugin: __WEBPACK_IMPORTED_MODULE_5__foundation_tabs__["Tabs"] + }, + accordion: { + cssClass: 'accordion', + plugin: __WEBPACK_IMPORTED_MODULE_4__foundation_accordion__["Accordion"] + } +}; + +/** + * ResponsiveAccordionTabs module. + * @module foundation.responsiveAccordionTabs + * @requires foundation.util.motion + * @requires foundation.accordion + * @requires foundation.tabs + */ + +var ResponsiveAccordionTabs = function (_Plugin) { + _inherits(ResponsiveAccordionTabs, _Plugin); + + function ResponsiveAccordionTabs() { + _classCallCheck(this, ResponsiveAccordionTabs); + + return _possibleConstructorReturn(this, (ResponsiveAccordionTabs.__proto__ || Object.getPrototypeOf(ResponsiveAccordionTabs)).apply(this, arguments)); + } + + _createClass(ResponsiveAccordionTabs, [{ + key: '_setup', + + /** + * Creates a new instance of a responsive accordion tabs. + * @class + * @name ResponsiveAccordionTabs + * @fires ResponsiveAccordionTabs#init + * @param {jQuery} element - jQuery object to make into Responsive Accordion Tabs. + * @param {Object} options - Overrides to the default plugin settings. + */ + value: function _setup(element, options) { + this.$element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(element); + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, this.$element.data(), options); + this.rules = this.$element.data('responsive-accordion-tabs'); + this.currentMq = null; + this.currentPlugin = null; + this.className = 'ResponsiveAccordionTabs'; // ie9 back compat + if (!this.$element.attr('id')) { + this.$element.attr('id', __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["GetYoDigits"])(6, 'responsiveaccordiontabs')); + }; + + this._init(); + this._events(); + } + + /** + * Initializes the Menu by parsing the classes from the 'data-responsive-accordion-tabs' attribute on the element. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"]._init(); + + // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules + if (typeof this.rules === 'string') { + var rulesTree = {}; + + // Parse rules from "classes" pulled from data attribute + var rules = this.rules.split(' '); + + // Iterate through every rule found + for (var i = 0; i < rules.length; i++) { + var rule = rules[i].split('-'); + var ruleSize = rule.length > 1 ? rule[0] : 'small'; + var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; + + if (MenuPlugins[rulePlugin] !== null) { + rulesTree[ruleSize] = MenuPlugins[rulePlugin]; + } + } + + this.rules = rulesTree; + } + + this._getAllOptions(); + + if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default.a.isEmptyObject(this.rules)) { + this._checkMediaQueries(); + } + } + }, { + key: '_getAllOptions', + value: function _getAllOptions() { + //get all defaults and options + var _this = this; + _this.allOptions = {}; + for (var key in MenuPlugins) { + if (MenuPlugins.hasOwnProperty(key)) { + var obj = MenuPlugins[key]; + try { + var dummyPlugin = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
      '); + var tmpPlugin = new obj.plugin(dummyPlugin, _this.options); + for (var keyKey in tmpPlugin.options) { + if (tmpPlugin.options.hasOwnProperty(keyKey) && keyKey !== 'zfPlugin') { + var objObj = tmpPlugin.options[keyKey]; + _this.allOptions[keyKey] = objObj; + } + } + tmpPlugin.destroy(); + } catch (e) {} + } + } + } + + /** + * Initializes events for the Menu. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', function () { + _this._checkMediaQueries(); + }); + } + + /** + * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. + * @function + * @private + */ + + }, { + key: '_checkMediaQueries', + value: function _checkMediaQueries() { + var matchedMq, + _this = this; + // Iterate through each rule and find the last matching rule + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.each(this.rules, function (key) { + if (__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].atLeast(key)) { + matchedMq = key; + } + }); + + // No match? No dice + if (!matchedMq) return; + + // Plugin already initialized? We good + if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; + + // Remove existing plugin-specific CSS classes + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.each(MenuPlugins, function (key, value) { + _this.$element.removeClass(value.cssClass); + }); + + // Add the CSS class for the new plugin + this.$element.addClass(this.rules[matchedMq].cssClass); + + // Create an instance of the new plugin + if (this.currentPlugin) { + //don't know why but on nested elements data zfPlugin get's lost + if (!this.currentPlugin.$element.data('zfPlugin') && this.storezfData) this.currentPlugin.$element.data('zfPlugin', this.storezfData); + this.currentPlugin.destroy(); + } + this._handleMarkup(this.rules[matchedMq].cssClass); + this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); + this.storezfData = this.currentPlugin.$element.data('zfPlugin'); + } + }, { + key: '_handleMarkup', + value: function _handleMarkup(toSet) { + var _this = this, + fromString = 'accordion'; + var $panels = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-tabs-content=' + this.$element.attr('id') + ']'); + if ($panels.length) fromString = 'tabs'; + if (fromString === toSet) { + return; + }; + + var tabsTitle = _this.allOptions.linkClass ? _this.allOptions.linkClass : 'tabs-title'; + var tabsPanel = _this.allOptions.panelClass ? _this.allOptions.panelClass : 'tabs-panel'; + + this.$element.removeAttr('role'); + var $liHeads = this.$element.children('.' + tabsTitle + ',[data-accordion-item]').removeClass(tabsTitle).removeClass('accordion-item').removeAttr('data-accordion-item'); + var $liHeadsA = $liHeads.children('a').removeClass('accordion-title'); + + if (fromString === 'tabs') { + $panels = $panels.children('.' + tabsPanel).removeClass(tabsPanel).removeAttr('role').removeAttr('aria-hidden').removeAttr('aria-labelledby'); + $panels.children('a').removeAttr('role').removeAttr('aria-controls').removeAttr('aria-selected'); + } else { + $panels = $liHeads.children('[data-tab-content]').removeClass('accordion-content'); + }; + + $panels.css({ display: '', visibility: '' }); + $liHeads.css({ display: '', visibility: '' }); + if (toSet === 'accordion') { + $panels.each(function (key, value) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(value).appendTo($liHeads.get(key)).addClass('accordion-content').attr('data-tab-content', '').removeClass('is-active').css({ height: '' }); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-tabs-content=' + _this.$element.attr('id') + ']').after('
      ').detach(); + $liHeads.addClass('accordion-item').attr('data-accordion-item', ''); + $liHeadsA.addClass('accordion-title'); + }); + } else if (toSet === 'tabs') { + var $tabsContent = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-tabs-content=' + _this.$element.attr('id') + ']'); + var $placeholder = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#tabs-placeholder-' + _this.$element.attr('id')); + if ($placeholder.length) { + $tabsContent = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
      ').insertAfter($placeholder).attr('data-tabs-content', _this.$element.attr('id')); + $placeholder.remove(); + } else { + $tabsContent = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
      ').insertAfter(_this.$element).attr('data-tabs-content', _this.$element.attr('id')); + }; + $panels.each(function (key, value) { + var tempValue = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(value).appendTo($tabsContent).addClass(tabsPanel); + var hash = $liHeadsA.get(key).hash.slice(1); + var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(value).attr('id') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["GetYoDigits"])(6, 'accordion'); + if (hash !== id) { + if (hash !== '') { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(value).attr('id', hash); + } else { + hash = id; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(value).attr('id', hash); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()($liHeadsA.get(key)).attr('href', __WEBPACK_IMPORTED_MODULE_0_jquery___default()($liHeadsA.get(key)).attr('href').replace('#', '') + '#' + hash); + }; + }; + var isActive = __WEBPACK_IMPORTED_MODULE_0_jquery___default()($liHeads.get(key)).hasClass('is-active'); + if (isActive) { + tempValue.addClass('is-active'); + }; + }); + $liHeads.addClass(tabsTitle); + }; + } + + /** + * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + if (this.currentPlugin) this.currentPlugin.destroy(); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('.zf.ResponsiveAccordionTabs'); + } + }]); + + return ResponsiveAccordionTabs; +}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["Plugin"]); + +ResponsiveAccordionTabs.defaults = {}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 72: +/***/ (function(module, exports) { + +module.exports = {Accordion: window.Foundation.Accordion}; + +/***/ }), + +/***/ 77: +/***/ (function(module, exports) { + +module.exports = {Tabs: window.Foundation.Tabs}; + +/***/ }), + +/***/ 90: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(24); + + +/***/ }) + +/******/ }); +/******/ + (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 = 91); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 25: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_responsiveMenu__ = __webpack_require__(55); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_responsiveMenu__["a" /* ResponsiveMenu */], 'ResponsiveMenu'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 55: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ResponsiveMenu; }); +/* 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_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_dropdownMenu__ = __webpack_require__(75); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_dropdownMenu___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_dropdownMenu__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_drilldown__ = __webpack_require__(74); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_drilldown___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__foundation_drilldown__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__foundation_accordionMenu__ = __webpack_require__(73); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__foundation_accordionMenu___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__foundation_accordionMenu__); + + +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 MenuPlugins = { + dropdown: { + cssClass: 'dropdown', + plugin: __WEBPACK_IMPORTED_MODULE_4__foundation_dropdownMenu__["DropdownMenu"] + }, + drilldown: { + cssClass: 'drilldown', + plugin: __WEBPACK_IMPORTED_MODULE_5__foundation_drilldown__["Drilldown"] + }, + accordion: { + cssClass: 'accordion-menu', + plugin: __WEBPACK_IMPORTED_MODULE_6__foundation_accordionMenu__["AccordionMenu"] + } +}; + +// import "foundation.util.triggers.js"; + + +/** + * ResponsiveMenu module. + * @module foundation.responsiveMenu + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + */ + +var ResponsiveMenu = function (_Plugin) { + _inherits(ResponsiveMenu, _Plugin); + + function ResponsiveMenu() { + _classCallCheck(this, ResponsiveMenu); + + return _possibleConstructorReturn(this, (ResponsiveMenu.__proto__ || Object.getPrototypeOf(ResponsiveMenu)).apply(this, arguments)); + } + + _createClass(ResponsiveMenu, [{ + key: '_setup', + + /** + * Creates a new instance of a responsive menu. + * @class + * @name ResponsiveMenu + * @fires ResponsiveMenu#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 = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(element); + this.rules = this.$element.data('responsive-menu'); + this.currentMq = null; + this.currentPlugin = null; + this.className = 'ResponsiveMenu'; // ie9 back compat + + this._init(); + this._events(); + } + + /** + * Initializes the Menu by parsing the classes from the 'data-ResponsiveMenu' attribute on the element. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"]._init(); + // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules + if (typeof this.rules === 'string') { + var rulesTree = {}; + + // Parse rules from "classes" pulled from data attribute + var rules = this.rules.split(' '); + + // Iterate through every rule found + for (var i = 0; i < rules.length; i++) { + var rule = rules[i].split('-'); + var ruleSize = rule.length > 1 ? rule[0] : 'small'; + var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; + + if (MenuPlugins[rulePlugin] !== null) { + rulesTree[ruleSize] = MenuPlugins[rulePlugin]; + } + } + + this.rules = rulesTree; + } + + if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default.a.isEmptyObject(this.rules)) { + this._checkMediaQueries(); + } + // Add data-mutate since children may need it. + this.$element.attr('data-mutate', this.$element.attr('data-mutate') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["GetYoDigits"])(6, 'responsive-menu')); + } + + /** + * Initializes events for the Menu. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', function () { + _this._checkMediaQueries(); + }); + // $(window).on('resize.zf.ResponsiveMenu', function() { + // _this._checkMediaQueries(); + // }); + } + + /** + * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. + * @function + * @private + */ + + }, { + key: '_checkMediaQueries', + value: function _checkMediaQueries() { + var matchedMq, + _this = this; + // Iterate through each rule and find the last matching rule + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.each(this.rules, function (key) { + if (__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].atLeast(key)) { + matchedMq = key; + } + }); + + // No match? No dice + if (!matchedMq) return; + + // Plugin already initialized? We good + if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; + + // Remove existing plugin-specific CSS classes + __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.each(MenuPlugins, function (key, value) { + _this.$element.removeClass(value.cssClass); + }); + + // Add the CSS class for the new plugin + this.$element.addClass(this.rules[matchedMq].cssClass); + + // Create an instance of the new plugin + if (this.currentPlugin) this.currentPlugin.destroy(); + this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); + } + + /** + * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.currentPlugin.destroy(); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('.zf.ResponsiveMenu'); + } + }]); + + return ResponsiveMenu; +}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["Plugin"]); + +ResponsiveMenu.defaults = {}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 73: +/***/ (function(module, exports) { + +module.exports = {AccordionMenu: window.Foundation.AccordionMenu}; + +/***/ }), + +/***/ 74: +/***/ (function(module, exports) { + +module.exports = {Drilldown: window.Foundation.Drilldown}; + +/***/ }), + +/***/ 75: +/***/ (function(module, exports) { + +module.exports = {DropdownMenu: window.Foundation.DropdownMenu}; + +/***/ }), + +/***/ 91: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(25); + + +/***/ }) + +/******/ }); +/******/ + (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 = 92); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 26: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_responsiveToggle__ = __webpack_require__(56); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_responsiveToggle__["a" /* ResponsiveToggle */], 'ResponsiveToggle'); + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 56: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ResponsiveToggle; }); +/* 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_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__ = __webpack_require__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__); + + +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; } + + + + + + + +/** + * ResponsiveToggle module. + * @module foundation.responsiveToggle + * @requires foundation.util.mediaQuery + * @requires foundation.util.motion + */ + +var ResponsiveToggle = function (_Plugin) { + _inherits(ResponsiveToggle, _Plugin); + + function ResponsiveToggle() { + _classCallCheck(this, ResponsiveToggle); + + return _possibleConstructorReturn(this, (ResponsiveToggle.__proto__ || Object.getPrototypeOf(ResponsiveToggle)).apply(this, arguments)); + } + + _createClass(ResponsiveToggle, [{ + key: '_setup', + + /** + * Creates a new instance of Tab Bar. + * @class + * @name ResponsiveToggle + * @fires ResponsiveToggle#init + * @param {jQuery} element - jQuery object to attach tab bar functionality to. + * @param {Object} options - Overrides to the default plugin settings. + */ + value: function _setup(element, options) { + this.$element = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(element); + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, ResponsiveToggle.defaults, this.$element.data(), options); + this.className = 'ResponsiveToggle'; // ie9 back compat + + this._init(); + this._events(); + } + + /** + * Initializes the tab bar by finding the target element, toggling element, and running update(). + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"]._init(); + var targetID = this.$element.data('responsive-toggle'); + if (!targetID) { + console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.'); + } + + this.$targetMenu = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + targetID); + this.$toggler = this.$element.find('[data-toggle]').filter(function () { + var target = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('toggle'); + return target === targetID || target === ""; + }); + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, this.options, this.$targetMenu.data()); + + // If they were set, parse the animation classes + if (this.options.animate) { + var input = this.options.animate.split(' '); + + this.animationIn = input[0]; + this.animationOut = input[1] || null; + } + + this._update(); + } + + /** + * Adds necessary event handlers for the tab bar to work. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + this._updateMqHandler = this._update.bind(this); + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('changed.zf.mediaquery', this._updateMqHandler); + + this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this)); + } + + /** + * Checks the current media query to determine if the tab bar should be visible or hidden. + * @function + * @private + */ + + }, { + key: '_update', + value: function _update() { + // Mobile + if (!__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].atLeast(this.options.hideFor)) { + this.$element.show(); + this.$targetMenu.hide(); + } + + // Desktop + else { + this.$element.hide(); + this.$targetMenu.show(); + } + } + + /** + * Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it. + * @function + * @fires ResponsiveToggle#toggled + */ + + }, { + key: 'toggleMenu', + value: function toggleMenu() { + var _this3 = this; + + if (!__WEBPACK_IMPORTED_MODULE_1__foundation_util_mediaQuery__["MediaQuery"].atLeast(this.options.hideFor)) { + /** + * Fires when the element attached to the tab bar toggles. + * @event ResponsiveToggle#toggled + */ + if (this.options.animate) { + if (this.$targetMenu.is(':hidden')) { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__["Motion"].animateIn(this.$targetMenu, this.animationIn, function () { + _this3.$element.trigger('toggled.zf.responsiveToggle'); + _this3.$targetMenu.find('[data-mutate]').triggerHandler('mutateme.zf.trigger'); + }); + } else { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__["Motion"].animateOut(this.$targetMenu, this.animationOut, function () { + _this3.$element.trigger('toggled.zf.responsiveToggle'); + }); + } + } else { + this.$targetMenu.toggle(0); + this.$targetMenu.find('[data-mutate]').trigger('mutateme.zf.trigger'); + this.$element.trigger('toggled.zf.responsiveToggle'); + } + } + } + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('.zf.responsiveToggle'); + this.$toggler.off('.zf.responsiveToggle'); + + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('changed.zf.mediaquery', this._updateMqHandler); + } + }]); + + return ResponsiveToggle; +}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["Plugin"]); + +ResponsiveToggle.defaults = { + /** + * The breakpoint after which the menu is always shown, and the tab bar is hidden. + * @option + * @type {string} + * @default 'medium' + */ + hideFor: 'medium', + + /** + * To decide if the toggle should be animated or not. + * @option + * @type {boolean} + * @default false + */ + animate: false +}; + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 92: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(26); + + +/***/ }) + +/******/ }); +/******/ + (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 = 93); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 27: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_reveal__ = __webpack_require__(57); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_reveal__["a" /* Reveal */], 'Reveal'); + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 57: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Reveal; }); +/* 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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__ = __webpack_require__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_triggers__ = __webpack_require__(7); + + +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; } + + + + + + + + +/** + * Reveal module. + * @module foundation.reveal + * @requires foundation.util.keyboard + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + * @requires foundation.util.motion if using animations + */ + +var Reveal = function (_Plugin) { + _inherits(Reveal, _Plugin); + + function Reveal() { + _classCallCheck(this, Reveal); + + return _possibleConstructorReturn(this, (Reveal.__proto__ || Object.getPrototypeOf(Reveal)).apply(this, arguments)); + } + + _createClass(Reveal, [{ + key: '_setup', + + /** + * Creates a new instance of Reveal. + * @class + * @name Reveal + * @param {jQuery} element - jQuery object to use for the modal. + * @param {Object} options - optional parameters. + */ + value: function _setup(element, options) { + this.$element = element; + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Reveal.defaults, this.$element.data(), options); + this.className = 'Reveal'; // ie9 back compat + this._init(); + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_5__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].register('Reveal', { + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the modal by adding the overlay and close buttons, (if selected). + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"]._init(); + this.id = this.$element.attr('id'); + this.isActive = false; + this.cached = { mq: __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].current }; + this.isMobile = mobileSniff(); + + this.$anchor = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-open="' + this.id + '"]').length ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-open="' + this.id + '"]') : __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-toggle="' + this.id + '"]'); + this.$anchor.attr({ + 'aria-controls': this.id, + 'aria-haspopup': true, + 'tabindex': 0 + }); + + if (this.options.fullScreen || this.$element.hasClass('full')) { + this.options.fullScreen = true; + this.options.overlay = false; + } + if (this.options.overlay && !this.$overlay) { + this.$overlay = this._makeOverlay(this.id); + } + + this.$element.attr({ + 'role': 'dialog', + 'aria-hidden': true, + 'data-yeti-box': this.id, + 'data-resize': this.id + }); + + if (this.$overlay) { + this.$element.detach().appendTo(this.$overlay); + } else { + this.$element.detach().appendTo(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.options.appendTo)); + this.$element.addClass('without-overlay'); + } + this._events(); + if (this.options.deepLink && window.location.hash === '#' + this.id) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).one('load.zf.reveal', this.open.bind(this)); + } + } + + /** + * Creates an overlay div to display behind the modal. + * @private + */ + + }, { + key: '_makeOverlay', + value: function _makeOverlay() { + var additionalOverlayClasses = ''; + + if (this.options.additionalOverlayClasses) { + additionalOverlayClasses = ' ' + this.options.additionalOverlayClasses; + } + + return __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
      ').addClass('reveal-overlay' + additionalOverlayClasses).appendTo(this.options.appendTo); + } + + /** + * Updates position of modal + * TODO: Figure out if we actually need to cache these values or if it doesn't matter + * @private + */ + + }, { + key: '_updatePosition', + value: function _updatePosition() { + var width = this.$element.outerWidth(); + var outerWidth = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).width(); + var height = this.$element.outerHeight(); + var outerHeight = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).height(); + var left, top; + if (this.options.hOffset === 'auto') { + left = parseInt((outerWidth - width) / 2, 10); + } else { + left = parseInt(this.options.hOffset, 10); + } + if (this.options.vOffset === 'auto') { + if (height > outerHeight) { + top = parseInt(Math.min(100, outerHeight / 10), 10); + } else { + top = parseInt((outerHeight - height) / 4, 10); + } + } else { + top = parseInt(this.options.vOffset, 10); + } + this.$element.css({ top: top + 'px' }); + // only worry about left if we don't have an overlay or we havea horizontal offset, + // otherwise we're perfectly in the middle + if (!this.$overlay || this.options.hOffset !== 'auto') { + this.$element.css({ left: left + 'px' }); + this.$element.css({ margin: '0px' }); + } + } + + /** + * Adds event handlers for the modal. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this3 = this; + + var _this = this; + + this.$element.on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': function (event, $element) { + if (event.target === _this.$element[0] || __WEBPACK_IMPORTED_MODULE_0_jquery___default()(event.target).parents('[data-closable]')[0] === $element) { + // only close reveal when it's explicitly called + return _this3.close.apply(_this3); + } + }, + 'toggle.zf.trigger': this.toggle.bind(this), + 'resizeme.zf.trigger': function () { + _this._updatePosition(); + } + }); + + if (this.options.closeOnClick && this.options.overlay) { + this.$overlay.off('.zf.reveal').on('click.zf.reveal', function (e) { + if (e.target === _this.$element[0] || __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.contains(_this.$element[0], e.target) || !__WEBPACK_IMPORTED_MODULE_0_jquery___default.a.contains(document, e.target)) { + return; + } + _this.close(); + }); + } + if (this.options.deepLink) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('popstate.zf.reveal:' + this.id, this._handleState.bind(this)); + } + } + + /** + * Handles modal methods on back/forward button clicks or any other event that triggers popstate. + * @private + */ + + }, { + key: '_handleState', + value: function _handleState(e) { + if (window.location.hash === '#' + this.id && !this.isActive) { + this.open(); + } else { + this.close(); + } + } + + /** + * Opens the modal controlled by `this.$anchor`, and closes all others by default. + * @function + * @fires Reveal#closeme + * @fires Reveal#open + */ + + }, { + key: 'open', + value: function open() { + var _this4 = this; + + // either update or replace browser history + if (this.options.deepLink) { + var hash = '#' + this.id; + + if (window.history.pushState) { + if (this.options.updateHistory) { + window.history.pushState({}, '', hash); + } else { + window.history.replaceState({}, '', hash); + } + } else { + window.location.hash = hash; + } + } + + this.isActive = true; + + // Make elements invisible, but remove display: none so we can get size and positioning + this.$element.css({ 'visibility': 'hidden' }).show().scrollTop(0); + if (this.options.overlay) { + this.$overlay.css({ 'visibility': 'hidden' }).show(); + } + + this._updatePosition(); + + this.$element.hide().css({ 'visibility': '' }); + + if (this.$overlay) { + this.$overlay.css({ 'visibility': '' }).hide(); + if (this.$element.hasClass('fast')) { + this.$overlay.addClass('fast'); + } else if (this.$element.hasClass('slow')) { + this.$overlay.addClass('slow'); + } + } + + if (!this.options.multipleOpened) { + /** + * Fires immediately before the modal opens. + * Closes any other modals that are currently open + * @event Reveal#closeme + */ + this.$element.trigger('closeme.zf.reveal', this.id); + } + + var _this = this; + + function addRevealOpenClasses() { + if (_this.isMobile) { + if (!_this.originalScrollPos) { + _this.originalScrollPos = window.pageYOffset; + } + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').addClass('is-reveal-open'); + } else { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').addClass('is-reveal-open'); + } + } + // Motion UI method of reveal + if (this.options.animationIn) { + var afterAnimation = function () { + _this.$element.attr({ + 'aria-hidden': false, + 'tabindex': -1 + }).focus(); + addRevealOpenClasses(); + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].trapFocus(_this.$element); + }; + + if (this.options.overlay) { + __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__["Motion"].animateIn(this.$overlay, 'fade-in'); + } + __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__["Motion"].animateIn(this.$element, this.options.animationIn, function () { + if (_this4.$element) { + // protect against object having been removed + _this4.focusableElements = __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].findFocusable(_this4.$element); + afterAnimation(); + } + }); + } + // jQuery method of reveal + else { + if (this.options.overlay) { + this.$overlay.show(0); + } + this.$element.show(this.options.showDelay); + } + + // handle accessibility + this.$element.attr({ + 'aria-hidden': false, + 'tabindex': -1 + }).focus(); + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].trapFocus(this.$element); + + addRevealOpenClasses(); + + this._extraHandlers(); + + /** + * Fires when the modal has successfully opened. + * @event Reveal#open + */ + this.$element.trigger('open.zf.reveal'); + } + + /** + * Adds extra event handlers for the body and window if necessary. + * @private + */ + + }, { + key: '_extraHandlers', + value: function _extraHandlers() { + var _this = this; + if (!this.$element) { + return; + } // If we're in the middle of cleanup, don't freak out + this.focusableElements = __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].findFocusable(this.$element); + + if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').on('click.zf.reveal', function (e) { + if (e.target === _this.$element[0] || __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.contains(_this.$element[0], e.target) || !__WEBPACK_IMPORTED_MODULE_0_jquery___default.a.contains(document, e.target)) { + return; + } + _this.close(); + }); + } + + if (this.options.closeOnEsc) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).on('keydown.zf.reveal', function (e) { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].handleKey(e, 'Reveal', { + close: function () { + if (_this.options.closeOnEsc) { + _this.close(); + } + } + }); + }); + } + } + + /** + * Closes the modal. + * @function + * @fires Reveal#closed + */ + + }, { + key: 'close', + value: function close() { + if (!this.isActive || !this.$element.is(':visible')) { + return false; + } + var _this = this; + + // Motion UI method of hiding + if (this.options.animationOut) { + if (this.options.overlay) { + __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__["Motion"].animateOut(this.$overlay, 'fade-out'); + } + + __WEBPACK_IMPORTED_MODULE_3__foundation_util_motion__["Motion"].animateOut(this.$element, this.options.animationOut, finishUp); + } + // jQuery method of hiding + else { + this.$element.hide(this.options.hideDelay); + + if (this.options.overlay) { + this.$overlay.hide(0, finishUp); + } else { + finishUp(); + } + } + + // Conditionals to remove extra event listeners added on open + if (this.options.closeOnEsc) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('keydown.zf.reveal'); + } + + if (!this.options.overlay && this.options.closeOnClick) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').off('click.zf.reveal'); + } + + this.$element.off('keydown.zf.reveal'); + + function finishUp() { + if (_this.isMobile) { + if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()('.reveal:visible').length === 0) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('html, body').removeClass('is-reveal-open'); + } + if (_this.originalScrollPos) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').scrollTop(_this.originalScrollPos); + _this.originalScrollPos = null; + } + } else { + if (__WEBPACK_IMPORTED_MODULE_0_jquery___default()('.reveal:visible').length === 0) { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body').removeClass('is-reveal-open'); + } + } + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].releaseFocus(_this.$element); + + _this.$element.attr('aria-hidden', true); + + /** + * Fires when the modal is done closing. + * @event Reveal#closed + */ + _this.$element.trigger('closed.zf.reveal'); + } + + /** + * Resets the modal content + * This prevents a running video to keep going in the background + */ + if (this.options.resetOnClose) { + this.$element.html(this.$element.html()); + } + + this.isActive = false; + if (_this.options.deepLink) { + if (window.history.replaceState) { + window.history.replaceState('', document.title, window.location.href.replace('#' + this.id, '')); + } else { + window.location.hash = ''; + } + } + + this.$anchor.focus(); + } + + /** + * Toggles the open/closed state of a modal. + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.isActive) { + this.close(); + } else { + this.open(); + } + } + }, { + key: '_destroy', + + + /** + * Destroys an instance of a modal. + * @function + */ + value: function _destroy() { + if (this.options.overlay) { + this.$element.appendTo(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.options.appendTo)); // move $element outside of $overlay to prevent error unregisterPlugin() + this.$overlay.hide().off().remove(); + } + this.$element.hide().off(); + this.$anchor.off('.zf'); + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off('.zf.reveal:' + this.id); + } + }]); + + return Reveal; +}(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__["Plugin"]); + +Reveal.defaults = { + /** + * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. + * @option + * @type {string} + * @default '' + */ + animationIn: '', + /** + * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. + * @option + * @type {string} + * @default '' + */ + animationOut: '', + /** + * Time, in ms, to delay the opening of a modal after a click if no animation used. + * @option + * @type {number} + * @default 0 + */ + showDelay: 0, + /** + * Time, in ms, to delay the closing of a modal after a click if no animation used. + * @option + * @type {number} + * @default 0 + */ + hideDelay: 0, + /** + * Allows a click on the body/overlay to close the modal. + * @option + * @type {boolean} + * @default true + */ + closeOnClick: true, + /** + * Allows the modal to close if the user presses the `ESCAPE` key. + * @option + * @type {boolean} + * @default true + */ + closeOnEsc: true, + /** + * If true, allows multiple modals to be displayed at once. + * @option + * @type {boolean} + * @default false + */ + multipleOpened: false, + /** + * Distance, in pixels, the modal should push down from the top of the screen. + * @option + * @type {number|string} + * @default auto + */ + vOffset: 'auto', + /** + * Distance, in pixels, the modal should push in from the side of the screen. + * @option + * @type {number|string} + * @default auto + */ + hOffset: 'auto', + /** + * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well. + * @option + * @type {boolean} + * @default false + */ + fullScreen: false, + /** + * Percentage of screen height the modal should push up from the bottom of the view. + * @option + * @type {number} + * @default 10 + */ + btmOffsetPct: 10, + /** + * Allows the modal to generate an overlay div, which will cover the view when modal opens. + * @option + * @type {boolean} + * @default true + */ + overlay: true, + /** + * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background. + * @option + * @type {boolean} + * @default false + */ + resetOnClose: false, + /** + * Allows the modal to alter the url on open/close, and allows the use of the `back` button to close modals. ALSO, allows a modal to auto-maniacally open on page load IF the hash === the modal's user-set id. + * @option + * @type {boolean} + * @default false + */ + deepLink: false, + /** + * Update the browser history with the open modal + * @option + * @default false + */ + updateHistory: false, + /** + * Allows the modal to append to custom div. + * @option + * @type {string} + * @default "body" + */ + appendTo: "body", + /** + * Allows adding additional class names to the reveal overlay. + * @option + * @type {string} + * @default '' + */ + additionalOverlayClasses: '' +}; + +function iPhoneSniff() { + return (/iP(ad|hone|od).*OS/.test(window.navigator.userAgent) + ); +} + +function androidSniff() { + return (/Android/.test(window.navigator.userAgent) + ); +} + +function mobileSniff() { + return iPhoneSniff() || androidSniff(); +} + + + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 93: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(27); + + +/***/ }) + +/******/ }); +/******/ + (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 = 94); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 12: +/***/ (function(module, exports) { + +module.exports = {Touch: window.Foundation.Touch}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 28: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_slider__ = __webpack_require__(58); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_slider__["a" /* Slider */], 'Slider'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 58: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Slider; }); +/* 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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__ = __webpack_require__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_touch__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__foundation_util_touch___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__foundation_util_touch__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__foundation_util_triggers__ = __webpack_require__(7); + + +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; } + + + + + + + + + + + +/** + * Slider module. + * @module foundation.slider + * @requires foundation.util.motion + * @requires foundation.util.triggers + * @requires foundation.util.keyboard + * @requires foundation.util.touch + */ + +var Slider = function (_Plugin) { + _inherits(Slider, _Plugin); + + function Slider() { + _classCallCheck(this, Slider); + + return _possibleConstructorReturn(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).apply(this, arguments)); + } + + _createClass(Slider, [{ + key: '_setup', + + /** + * Creates a new instance of a slider control. + * @class + * @name Slider + * @param {jQuery} element - jQuery object to make into a slider control. + * @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({}, Slider.defaults, this.$element.data(), options); + this.className = 'Slider'; // ie9 back compat + + // Touch and Triggers inits are idempotent, we just need to make sure it's initialied. + __WEBPACK_IMPORTED_MODULE_5__foundation_util_touch__["Touch"].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + __WEBPACK_IMPORTED_MODULE_6__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + this._init(); + + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].register('Slider', { + 'ltr': { + 'ARROW_RIGHT': 'increase', + 'ARROW_UP': 'increase', + 'ARROW_DOWN': 'decrease', + 'ARROW_LEFT': 'decrease', + 'SHIFT_ARROW_RIGHT': 'increase_fast', + 'SHIFT_ARROW_UP': 'increase_fast', + 'SHIFT_ARROW_DOWN': 'decrease_fast', + 'SHIFT_ARROW_LEFT': 'decrease_fast', + 'HOME': 'min', + 'END': 'max' + }, + 'rtl': { + 'ARROW_LEFT': 'increase', + 'ARROW_RIGHT': 'decrease', + 'SHIFT_ARROW_LEFT': 'increase_fast', + 'SHIFT_ARROW_RIGHT': 'decrease_fast' + } + }); + } + + /** + * Initilizes the plugin by reading/setting attributes, creating collections and setting the initial position of the handle(s). + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + this.inputs = this.$element.find('input'); + this.handles = this.$element.find('[data-slider-handle]'); + + this.$handle = this.handles.eq(0); + this.$input = this.inputs.length ? this.inputs.eq(0) : __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + this.$handle.attr('aria-controls')); + this.$fill = this.$element.find('[data-slider-fill]').css(this.options.vertical ? 'height' : 'width', 0); + + var isDbl = false, + _this = this; + if (this.options.disabled || this.$element.hasClass(this.options.disabledClass)) { + this.options.disabled = true; + this.$element.addClass(this.options.disabledClass); + } + if (!this.inputs.length) { + this.inputs = __WEBPACK_IMPORTED_MODULE_0_jquery___default()().add(this.$input); + this.options.binding = true; + } + + this._setInitAttr(0); + + if (this.handles[1]) { + this.options.doubleSided = true; + this.$handle2 = this.handles.eq(1); + this.$input2 = this.inputs.length > 1 ? this.inputs.eq(1) : __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + this.$handle2.attr('aria-controls')); + + if (!this.inputs[1]) { + this.inputs = this.inputs.add(this.$input2); + } + isDbl = true; + + // this.$handle.triggerHandler('click.zf.slider'); + this._setInitAttr(1); + } + + // Set handle positions + this.setHandles(); + + this._events(); + } + }, { + key: 'setHandles', + value: function setHandles() { + var _this3 = this; + + if (this.handles[1]) { + this._setHandlePos(this.$handle, this.inputs.eq(0).val(), true, function () { + _this3._setHandlePos(_this3.$handle2, _this3.inputs.eq(1).val(), true); + }); + } else { + this._setHandlePos(this.$handle, this.inputs.eq(0).val(), true); + } + } + }, { + key: '_reflow', + value: function _reflow() { + this.setHandles(); + } + /** + * @function + * @private + * @param {Number} value - floating point (the value) to be transformed using to a relative position on the slider (the inverse of _value) + */ + + }, { + key: '_pctOfBar', + value: function _pctOfBar(value) { + var pctOfBar = percent(value - this.options.start, this.options.end - this.options.start); + + switch (this.options.positionValueFunction) { + case "pow": + pctOfBar = this._logTransform(pctOfBar); + break; + case "log": + pctOfBar = this._powTransform(pctOfBar); + break; + } + + return pctOfBar.toFixed(2); + } + + /** + * @function + * @private + * @param {Number} pctOfBar - floating point, the relative position of the slider (typically between 0-1) to be transformed to a value + */ + + }, { + key: '_value', + value: function _value(pctOfBar) { + switch (this.options.positionValueFunction) { + case "pow": + pctOfBar = this._powTransform(pctOfBar); + break; + case "log": + pctOfBar = this._logTransform(pctOfBar); + break; + } + var value = (this.options.end - this.options.start) * pctOfBar + this.options.start; + + return value; + } + + /** + * @function + * @private + * @param {Number} value - floating point (typically between 0-1) to be transformed using the log function + */ + + }, { + key: '_logTransform', + value: function _logTransform(value) { + return baseLog(this.options.nonLinearBase, value * (this.options.nonLinearBase - 1) + 1); + } + + /** + * @function + * @private + * @param {Number} value - floating point (typically between 0-1) to be transformed using the power function + */ + + }, { + key: '_powTransform', + value: function _powTransform(value) { + return (Math.pow(this.options.nonLinearBase, value) - 1) / (this.options.nonLinearBase - 1); + } + + /** + * Sets the position of the selected handle and fill bar. + * @function + * @private + * @param {jQuery} $hndl - the selected handle to move. + * @param {Number} location - floating point between the start and end values of the slider bar. + * @param {Function} cb - callback function to fire on completion. + * @fires Slider#moved + * @fires Slider#changed + */ + + }, { + key: '_setHandlePos', + value: function _setHandlePos($hndl, location, noInvert, cb) { + // don't move if the slider has been disabled since its initialization + if (this.$element.hasClass(this.options.disabledClass)) { + return; + } + //might need to alter that slightly for bars that will have odd number selections. + location = parseFloat(location); //on input change events, convert string to number...grumble. + + // prevent slider from running out of bounds, if value exceeds the limits set through options, override the value to min/max + if (location < this.options.start) { + location = this.options.start; + } else if (location > this.options.end) { + location = this.options.end; + } + + var isDbl = this.options.doubleSided; + + if (isDbl) { + //this block is to prevent 2 handles from crossing eachother. Could/should be improved. + if (this.handles.index($hndl) === 0) { + var h2Val = parseFloat(this.$handle2.attr('aria-valuenow')); + location = location >= h2Val ? h2Val - this.options.step : location; + } else { + var h1Val = parseFloat(this.$handle.attr('aria-valuenow')); + location = location <= h1Val ? h1Val + this.options.step : location; + } + } + + //this is for single-handled vertical sliders, it adjusts the value to account for the slider being "upside-down" + //for click and drag events, it's weird due to the scale(-1, 1) css property + if (this.options.vertical && !noInvert) { + location = this.options.end - location; + } + + var _this = this, + vert = this.options.vertical, + hOrW = vert ? 'height' : 'width', + lOrT = vert ? 'top' : 'left', + handleDim = $hndl[0].getBoundingClientRect()[hOrW], + elemDim = this.$element[0].getBoundingClientRect()[hOrW], + + //percentage of bar min/max value based on click or drag point + pctOfBar = this._pctOfBar(location), + + //number of actual pixels to shift the handle, based on the percentage obtained above + pxToMove = (elemDim - handleDim) * pctOfBar, + + //percentage of bar to shift the handle + movement = (percent(pxToMove, elemDim) * 100).toFixed(this.options.decimal); + //fixing the decimal value for the location number, is passed to other methods as a fixed floating-point value + location = parseFloat(location.toFixed(this.options.decimal)); + // declare empty object for css adjustments, only used with 2 handled-sliders + var css = {}; + + this._setValues($hndl, location); + + // TODO update to calculate based on values set to respective inputs?? + if (isDbl) { + var isLeftHndl = this.handles.index($hndl) === 0, + + //empty variable, will be used for min-height/width for fill bar + dim, + + //percentage w/h of the handle compared to the slider bar + handlePct = ~~(percent(handleDim, elemDim) * 100); + //if left handle, the math is slightly different than if it's the right handle, and the left/top property needs to be changed for the fill bar + if (isLeftHndl) { + //left or top percentage value to apply to the fill bar. + css[lOrT] = movement + '%'; + //calculate the new min-height/width for the fill bar. + dim = parseFloat(this.$handle2[0].style[lOrT]) - movement + handlePct; + //this callback is necessary to prevent errors and allow the proper placement and initialization of a 2-handled slider + //plus, it means we don't care if 'dim' isNaN on init, it won't be in the future. + if (cb && typeof cb === 'function') { + cb(); + } //this is only needed for the initialization of 2 handled sliders + } else { + //just caching the value of the left/bottom handle's left/top property + var handlePos = parseFloat(this.$handle[0].style[lOrT]); + //calculate the new min-height/width for the fill bar. Use isNaN to prevent false positives for numbers <= 0 + //based on the percentage of movement of the handle being manipulated, less the opposing handle's left/top position, plus the percentage w/h of the handle itself + dim = movement - (isNaN(handlePos) ? (this.options.initialStart - this.options.start) / ((this.options.end - this.options.start) / 100) : handlePos) + handlePct; + } + // assign the min-height/width to our css object + css['min-' + hOrW] = dim + '%'; + } + + this.$element.one('finished.zf.animate', function () { + /** + * Fires when the handle is done moving. + * @event Slider#moved + */ + _this.$element.trigger('moved.zf.slider', [$hndl]); + }); + + //because we don't know exactly how the handle will be moved, check the amount of time it should take to move. + var moveTime = this.$element.data('dragging') ? 1000 / 60 : this.options.moveTime; + + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_motion__["Move"])(moveTime, $hndl, function () { + // adjusting the left/top property of the handle, based on the percentage calculated above + // if movement isNaN, that is because the slider is hidden and we cannot determine handle width, + // fall back to next best guess. + if (isNaN(movement)) { + $hndl.css(lOrT, pctOfBar * 100 + '%'); + } else { + $hndl.css(lOrT, movement + '%'); + } + + if (!_this.options.doubleSided) { + //if single-handled, a simple method to expand the fill bar + _this.$fill.css(hOrW, pctOfBar * 100 + '%'); + } else { + //otherwise, use the css object we created above + _this.$fill.css(css); + } + }); + + /** + * Fires when the value has not been change for a given time. + * @event Slider#changed + */ + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.$element.trigger('changed.zf.slider', [$hndl]); + }, _this.options.changedDelay); + } + + /** + * Sets the initial attribute for the slider element. + * @function + * @private + * @param {Number} idx - index of the current handle/input to use. + */ + + }, { + key: '_setInitAttr', + value: function _setInitAttr(idx) { + var initVal = idx === 0 ? this.options.initialStart : this.options.initialEnd; + var id = this.inputs.eq(idx).attr('id') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["GetYoDigits"])(6, 'slider'); + this.inputs.eq(idx).attr({ + 'id': id, + 'max': this.options.end, + 'min': this.options.start, + 'step': this.options.step + }); + this.inputs.eq(idx).val(initVal); + this.handles.eq(idx).attr({ + 'role': 'slider', + 'aria-controls': id, + 'aria-valuemax': this.options.end, + 'aria-valuemin': this.options.start, + 'aria-valuenow': initVal, + 'aria-orientation': this.options.vertical ? 'vertical' : 'horizontal', + 'tabindex': 0 + }); + } + + /** + * Sets the input and `aria-valuenow` values for the slider element. + * @function + * @private + * @param {jQuery} $handle - the currently selected handle. + * @param {Number} val - floating point of the new value. + */ + + }, { + key: '_setValues', + value: function _setValues($handle, val) { + var idx = this.options.doubleSided ? this.handles.index($handle) : 0; + this.inputs.eq(idx).val(val); + $handle.attr('aria-valuenow', val); + } + + /** + * Handles events on the slider element. + * Calculates the new location of the current handle. + * If there are two handles and the bar was clicked, it determines which handle to move. + * @function + * @private + * @param {Object} e - the `event` object passed from the listener. + * @param {jQuery} $handle - the current handle to calculate for, if selected. + * @param {Number} val - floating point number for the new value of the slider. + * TODO clean this up, there's a lot of repeated code between this and the _setHandlePos fn. + */ + + }, { + key: '_handleEvent', + value: function _handleEvent(e, $handle, val) { + var value, hasVal; + if (!val) { + //click or drag events + e.preventDefault(); + var _this = this, + vertical = this.options.vertical, + param = vertical ? 'height' : 'width', + direction = vertical ? 'top' : 'left', + eventOffset = vertical ? e.pageY : e.pageX, + halfOfHandle = this.$handle[0].getBoundingClientRect()[param] / 2, + barDim = this.$element[0].getBoundingClientRect()[param], + windowScroll = vertical ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).scrollTop() : __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).scrollLeft(); + + var elemOffset = this.$element.offset()[direction]; + + // touch events emulated by the touch util give position relative to screen, add window.scroll to event coordinates... + // best way to guess this is simulated is if clientY == pageY + if (e.clientY === e.pageY) { + eventOffset = eventOffset + windowScroll; + } + var eventFromBar = eventOffset - elemOffset; + var barXY; + if (eventFromBar < 0) { + barXY = 0; + } else if (eventFromBar > barDim) { + barXY = barDim; + } else { + barXY = eventFromBar; + } + var offsetPct = percent(barXY, barDim); + + value = this._value(offsetPct); + + // turn everything around for RTL, yay math! + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__foundation_util_core__["rtl"])() && !this.options.vertical) { + value = this.options.end - value; + } + + value = _this._adjustValue(null, value); + //boolean flag for the setHandlePos fn, specifically for vertical sliders + hasVal = false; + + if (!$handle) { + //figure out which handle it is, pass it to the next function. + var firstHndlPos = absPosition(this.$handle, direction, barXY, param), + secndHndlPos = absPosition(this.$handle2, direction, barXY, param); + $handle = firstHndlPos <= secndHndlPos ? this.$handle : this.$handle2; + } + } else { + //change event on input + value = this._adjustValue(null, val); + hasVal = true; + } + + this._setHandlePos($handle, value, hasVal); + } + + /** + * Adjustes value for handle in regard to step value. returns adjusted value + * @function + * @private + * @param {jQuery} $handle - the selected handle. + * @param {Number} value - value to adjust. used if $handle is falsy + */ + + }, { + key: '_adjustValue', + value: function _adjustValue($handle, value) { + var val, + step = this.options.step, + div = parseFloat(step / 2), + left, + prev_val, + next_val; + if (!!$handle) { + val = parseFloat($handle.attr('aria-valuenow')); + } else { + val = value; + } + left = val % step; + prev_val = val - left; + next_val = prev_val + step; + if (left === 0) { + return val; + } + val = val >= prev_val + div ? next_val : prev_val; + return val; + } + + /** + * Adds event listeners to the slider elements. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this._eventsForHandle(this.$handle); + if (this.handles[1]) { + this._eventsForHandle(this.$handle2); + } + } + + /** + * Adds event listeners a particular handle + * @function + * @private + * @param {jQuery} $handle - the current handle to apply listeners to. + */ + + }, { + key: '_eventsForHandle', + value: function _eventsForHandle($handle) { + var _this = this, + curHandle, + timer; + + this.inputs.off('change.zf.slider').on('change.zf.slider', function (e) { + var idx = _this.inputs.index(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this)); + _this._handleEvent(e, _this.handles.eq(idx), __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).val()); + }); + + if (this.options.clickSelect) { + this.$element.off('click.zf.slider').on('click.zf.slider', function (e) { + if (_this.$element.data('dragging')) { + return false; + } + + if (!__WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.target).is('[data-slider-handle]')) { + if (_this.options.doubleSided) { + _this._handleEvent(e); + } else { + _this._handleEvent(e, _this.$handle); + } + } + }); + } + + if (this.options.draggable) { + this.handles.addTouch(); + + var $body = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('body'); + $handle.off('mousedown.zf.slider').on('mousedown.zf.slider', function (e) { + $handle.addClass('is-dragging'); + _this.$fill.addClass('is-dragging'); // + _this.$element.data('dragging', true); + + curHandle = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(e.currentTarget); + + $body.on('mousemove.zf.slider', function (e) { + e.preventDefault(); + _this._handleEvent(e, curHandle); + }).on('mouseup.zf.slider', function (e) { + _this._handleEvent(e, curHandle); + + $handle.removeClass('is-dragging'); + _this.$fill.removeClass('is-dragging'); + _this.$element.data('dragging', false); + + $body.off('mousemove.zf.slider mouseup.zf.slider'); + }); + }) + // prevent events triggered by touch + .on('selectstart.zf.slider touchmove.zf.slider', function (e) { + e.preventDefault(); + }); + } + + $handle.off('keydown.zf.slider').on('keydown.zf.slider', function (e) { + var _$handle = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), + idx = _this.options.doubleSided ? _this.handles.index(_$handle) : 0, + oldValue = parseFloat(_this.inputs.eq(idx).val()), + newValue; + + // handle keyboard event with keyboard util + __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__["Keyboard"].handleKey(e, 'Slider', { + decrease: function () { + newValue = oldValue - _this.options.step; + }, + increase: function () { + newValue = oldValue + _this.options.step; + }, + decrease_fast: function () { + newValue = oldValue - _this.options.step * 10; + }, + increase_fast: function () { + newValue = oldValue + _this.options.step * 10; + }, + min: function () { + newValue = _this.options.start; + }, + max: function () { + newValue = _this.options.end; + }, + handled: function () { + // only set handle pos when event was handled specially + e.preventDefault(); + _this._setHandlePos(_$handle, newValue, true); + } + }); + /*if (newValue) { // if pressed key has special function, update value + e.preventDefault(); + _this._setHandlePos(_$handle, newValue); + }*/ + }); + } + + /** + * Destroys the slider plugin. + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.handles.off('.zf.slider'); + this.inputs.off('.zf.slider'); + this.$element.off('.zf.slider'); + + clearTimeout(this.timeout); + } + }]); + + return Slider; +}(__WEBPACK_IMPORTED_MODULE_4__foundation_plugin__["Plugin"]); + +Slider.defaults = { + /** + * Minimum value for the slider scale. + * @option + * @type {number} + * @default 0 + */ + start: 0, + /** + * Maximum value for the slider scale. + * @option + * @type {number} + * @default 100 + */ + end: 100, + /** + * Minimum value change per change event. + * @option + * @type {number} + * @default 1 + */ + step: 1, + /** + * Value at which the handle/input *(left handle/first input)* should be set to on initialization. + * @option + * @type {number} + * @default 0 + */ + initialStart: 0, + /** + * Value at which the right handle/second input should be set to on initialization. + * @option + * @type {number} + * @default 100 + */ + initialEnd: 100, + /** + * Allows the input to be located outside the container and visible. Set to by the JS + * @option + * @type {boolean} + * @default false + */ + binding: false, + /** + * Allows the user to click/tap on the slider bar to select a value. + * @option + * @type {boolean} + * @default true + */ + clickSelect: true, + /** + * Set to true and use the `vertical` class to change alignment to vertical. + * @option + * @type {boolean} + * @default false + */ + vertical: false, + /** + * Allows the user to drag the slider handle(s) to select a value. + * @option + * @type {boolean} + * @default true + */ + draggable: true, + /** + * Disables the slider and prevents event listeners from being applied. Double checked by JS with `disabledClass`. + * @option + * @type {boolean} + * @default false + */ + disabled: false, + /** + * Allows the use of two handles. Double checked by the JS. Changes some logic handling. + * @option + * @type {boolean} + * @default false + */ + doubleSided: false, + /** + * Potential future feature. + */ + // steps: 100, + /** + * Number of decimal places the plugin should go to for floating point precision. + * @option + * @type {number} + * @default 2 + */ + decimal: 2, + /** + * Time delay for dragged elements. + */ + // dragDelay: 0, + /** + * Time, in ms, to animate the movement of a slider handle if user clicks/taps on the bar. Needs to be manually set if updating the transition time in the Sass settings. + * @option + * @type {number} + * @default 200 + */ + moveTime: 200, //update this if changing the transition time in the sass + /** + * Class applied to disabled sliders. + * @option + * @type {string} + * @default 'disabled' + */ + disabledClass: 'disabled', + /** + * Will invert the default layout for a vertical slider. + * @option + * @type {boolean} + * @default false + */ + invertVertical: false, + /** + * Milliseconds before the `changed.zf-slider` event is triggered after value change. + * @option + * @type {number} + * @default 500 + */ + changedDelay: 500, + /** + * Basevalue for non-linear sliders + * @option + * @type {number} + * @default 5 + */ + nonLinearBase: 5, + /** + * Basevalue for non-linear sliders, possible values are: `'linear'`, `'pow'` & `'log'`. Pow and Log use the nonLinearBase setting. + * @option + * @type {string} + * @default 'linear' + */ + positionValueFunction: 'linear' +}; + +function percent(frac, num) { + return frac / num; +} +function absPosition($handle, dir, clickPos, param) { + return Math.abs($handle.position()[dir] + $handle[param]() / 2 - clickPos); +} +function baseLog(base, value) { + return Math.log(value) / Math.log(base); +} + + + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 94: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(28); + + +/***/ }) + +/******/ }); +/******/ + (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 = 95); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 29: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_smoothScroll__ = __webpack_require__(59); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_smoothScroll__["a" /* SmoothScroll */], 'SmoothScroll'); + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 59: +/***/ (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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__); + + +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__["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__["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 +}; + + + +/***/ }), + +/***/ 95: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(29); + + +/***/ }) + +/******/ }); +/******/ + (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 = 96); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 30: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_sticky__ = __webpack_require__(60); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_sticky__["a" /* Sticky */], 'Sticky'); + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 60: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Sticky; }); +/* 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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_util_triggers__ = __webpack_require__(7); + + +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; } + + + + + + + +/** + * Sticky module. + * @module foundation.sticky + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + */ + +var Sticky = function (_Plugin) { + _inherits(Sticky, _Plugin); + + function Sticky() { + _classCallCheck(this, Sticky); + + return _possibleConstructorReturn(this, (Sticky.__proto__ || Object.getPrototypeOf(Sticky)).apply(this, arguments)); + } + + _createClass(Sticky, [{ + key: '_setup', + + /** + * Creates a new instance of a sticky thing. + * @class + * @name Sticky + * @param {jQuery} element - jQuery object to make sticky. + * @param {Object} options - options object passed when creating the element programmatically. + */ + value: function _setup(element, options) { + this.$element = element; + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Sticky.defaults, this.$element.data(), options); + this.className = 'Sticky'; // ie9 back compat + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_4__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + this._init(); + } + + /** + * Initializes the sticky element by adding classes, getting/setting dimensions, breakpoints and attributes + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"]._init(); + + var $parent = this.$element.parent('[data-sticky-container]'), + id = this.$element[0].id || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["GetYoDigits"])(6, 'sticky'), + _this = this; + + if ($parent.length) { + this.$container = $parent; + } else { + this.wasWrapped = true; + this.$element.wrap(this.options.container); + this.$container = this.$element.parent(); + } + this.$container.addClass(this.options.containerClass); + + this.$element.addClass(this.options.stickyClass).attr({ 'data-resize': id, 'data-mutate': id }); + if (this.options.anchor !== '') { + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + _this.options.anchor).attr({ 'data-mutate': id }); + } + + this.scrollCount = this.options.checkEvery; + this.isStuck = false; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).one('load.zf.sticky', function () { + //We calculate the container height to have correct values for anchor points offset calculation. + _this.containerHeight = _this.$element.css("display") == "none" ? 0 : _this.$element[0].getBoundingClientRect().height; + _this.$container.css('height', _this.containerHeight); + _this.elemHeight = _this.containerHeight; + if (_this.options.anchor !== '') { + _this.$anchor = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + _this.options.anchor); + } else { + _this._parsePoints(); + } + + _this._setSizes(function () { + var scroll = window.pageYOffset; + _this._calc(false, scroll); + //Unstick the element will ensure that proper classes are set. + if (!_this.isStuck) { + _this._removeSticky(scroll >= _this.topPoint ? false : true); + } + }); + _this._events(id.split('-').reverse().join('-')); + }); + } + + /** + * If using multiple elements as anchors, calculates the top and bottom pixel values the sticky thing should stick and unstick on. + * @function + * @private + */ + + }, { + key: '_parsePoints', + value: function _parsePoints() { + var top = this.options.topAnchor == "" ? 1 : this.options.topAnchor, + btm = this.options.btmAnchor == "" ? document.documentElement.scrollHeight : this.options.btmAnchor, + pts = [top, btm], + breaks = {}; + for (var i = 0, len = pts.length; i < len && pts[i]; i++) { + var pt; + if (typeof pts[i] === 'number') { + pt = pts[i]; + } else { + var place = pts[i].split(':'), + anchor = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + place[0]); + + pt = anchor.offset().top; + if (place[1] && place[1].toLowerCase() === 'bottom') { + pt += anchor[0].getBoundingClientRect().height; + } + } + breaks[i] = pt; + } + + this.points = breaks; + return; + } + + /** + * Adds event handlers for the scrolling element. + * @private + * @param {String} id - pseudo-random id for unique scroll event listener. + */ + + }, { + key: '_events', + value: function _events(id) { + var _this = this, + scrollListener = this.scrollListener = 'scroll.zf.' + id; + if (this.isOn) { + return; + } + if (this.canStick) { + this.isOn = true; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(scrollListener).on(scrollListener, function (e) { + if (_this.scrollCount === 0) { + _this.scrollCount = _this.options.checkEvery; + _this._setSizes(function () { + _this._calc(false, window.pageYOffset); + }); + } else { + _this.scrollCount--; + _this._calc(false, window.pageYOffset); + } + }); + } + + this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', function (e, el) { + _this._eventsHandler(id); + }); + + this.$element.on('mutateme.zf.trigger', function (e, el) { + _this._eventsHandler(id); + }); + + if (this.$anchor) { + this.$anchor.on('mutateme.zf.trigger', function (e, el) { + _this._eventsHandler(id); + }); + } + } + + /** + * Handler for events. + * @private + * @param {String} id - pseudo-random id for unique scroll event listener. + */ + + }, { + key: '_eventsHandler', + value: function _eventsHandler(id) { + var _this = this, + scrollListener = this.scrollListener = 'scroll.zf.' + id; + + _this._setSizes(function () { + _this._calc(false); + if (_this.canStick) { + if (!_this.isOn) { + _this._events(id); + } + } else if (_this.isOn) { + _this._pauseListeners(scrollListener); + } + }); + } + + /** + * Removes event handlers for scroll and change events on anchor. + * @fires Sticky#pause + * @param {String} scrollListener - unique, namespaced scroll listener attached to `window` + */ + + }, { + key: '_pauseListeners', + value: function _pauseListeners(scrollListener) { + this.isOn = false; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(scrollListener); + + /** + * Fires when the plugin is paused due to resize event shrinking the view. + * @event Sticky#pause + * @private + */ + this.$element.trigger('pause.zf.sticky'); + } + + /** + * Called on every `scroll` event and on `_init` + * fires functions based on booleans and cached values + * @param {Boolean} checkSizes - true if plugin should recalculate sizes and breakpoints. + * @param {Number} scroll - current scroll position passed from scroll event cb function. If not passed, defaults to `window.pageYOffset`. + */ + + }, { + key: '_calc', + value: function _calc(checkSizes, scroll) { + if (checkSizes) { + this._setSizes(); + } + + if (!this.canStick) { + if (this.isStuck) { + this._removeSticky(true); + } + return false; + } + + if (!scroll) { + scroll = window.pageYOffset; + } + + if (scroll >= this.topPoint) { + if (scroll <= this.bottomPoint) { + if (!this.isStuck) { + this._setSticky(); + } + } else { + if (this.isStuck) { + this._removeSticky(false); + } + } + } else { + if (this.isStuck) { + this._removeSticky(true); + } + } + } + + /** + * Causes the $element to become stuck. + * Adds `position: fixed;`, and helper classes. + * @fires Sticky#stuckto + * @function + * @private + */ + + }, { + key: '_setSticky', + value: function _setSticky() { + var _this = this, + stickTo = this.options.stickTo, + mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom', + notStuckTo = stickTo === 'top' ? 'bottom' : 'top', + css = {}; + + css[mrgn] = this.options[mrgn] + 'em'; + css[stickTo] = 0; + css[notStuckTo] = 'auto'; + this.isStuck = true; + this.$element.removeClass('is-anchored is-at-' + notStuckTo).addClass('is-stuck is-at-' + stickTo).css(css) + /** + * Fires when the $element has become `position: fixed;` + * Namespaced to `top` or `bottom`, e.g. `sticky.zf.stuckto:top` + * @event Sticky#stuckto + */ + .trigger('sticky.zf.stuckto:' + stickTo); + this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd", function () { + _this._setSizes(); + }); + } + + /** + * Causes the $element to become unstuck. + * Removes `position: fixed;`, and helper classes. + * Adds other helper classes. + * @param {Boolean} isTop - tells the function if the $element should anchor to the top or bottom of its $anchor element. + * @fires Sticky#unstuckfrom + * @private + */ + + }, { + key: '_removeSticky', + value: function _removeSticky(isTop) { + var stickTo = this.options.stickTo, + stickToTop = stickTo === 'top', + css = {}, + anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight, + mrgn = stickToTop ? 'marginTop' : 'marginBottom', + notStuckTo = stickToTop ? 'bottom' : 'top', + topOrBottom = isTop ? 'top' : 'bottom'; + + css[mrgn] = 0; + + css['bottom'] = 'auto'; + if (isTop) { + css['top'] = 0; + } else { + css['top'] = anchorPt; + } + + this.isStuck = false; + this.$element.removeClass('is-stuck is-at-' + stickTo).addClass('is-anchored is-at-' + topOrBottom).css(css) + /** + * Fires when the $element has become anchored. + * Namespaced to `top` or `bottom`, e.g. `sticky.zf.unstuckfrom:bottom` + * @event Sticky#unstuckfrom + */ + .trigger('sticky.zf.unstuckfrom:' + topOrBottom); + } + + /** + * Sets the $element and $container sizes for plugin. + * Calls `_setBreakPoints`. + * @param {Function} cb - optional callback function to fire on completion of `_setBreakPoints`. + * @private + */ + + }, { + key: '_setSizes', + value: function _setSizes(cb) { + this.canStick = __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].is(this.options.stickyOn); + if (!this.canStick) { + if (cb && typeof cb === 'function') { + cb(); + } + } + var _this = this, + newElemWidth = this.$container[0].getBoundingClientRect().width, + comp = window.getComputedStyle(this.$container[0]), + pdngl = parseInt(comp['padding-left'], 10), + pdngr = parseInt(comp['padding-right'], 10); + + if (this.$anchor && this.$anchor.length) { + this.anchorHeight = this.$anchor[0].getBoundingClientRect().height; + } else { + this._parsePoints(); + } + + this.$element.css({ + 'max-width': newElemWidth - pdngl - pdngr + 'px' + }); + + var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight; + if (this.$element.css("display") == "none") { + newContainerHeight = 0; + } + this.containerHeight = newContainerHeight; + this.$container.css({ + height: newContainerHeight + }); + this.elemHeight = newContainerHeight; + + if (!this.isStuck) { + if (this.$element.hasClass('is-at-bottom')) { + var anchorPt = (this.points ? this.points[1] - this.$container.offset().top : this.anchorHeight) - this.elemHeight; + this.$element.css('top', anchorPt); + } + } + + this._setBreakPoints(newContainerHeight, function () { + if (cb && typeof cb === 'function') { + cb(); + } + }); + } + + /** + * Sets the upper and lower breakpoints for the element to become sticky/unsticky. + * @param {Number} elemHeight - px value for sticky.$element height, calculated by `_setSizes`. + * @param {Function} cb - optional callback function to be called on completion. + * @private + */ + + }, { + key: '_setBreakPoints', + value: function _setBreakPoints(elemHeight, cb) { + if (!this.canStick) { + if (cb && typeof cb === 'function') { + cb(); + } else { + return false; + } + } + var mTop = emCalc(this.options.marginTop), + mBtm = emCalc(this.options.marginBottom), + topPoint = this.points ? this.points[0] : this.$anchor.offset().top, + bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight, + + // topPoint = this.$anchor.offset().top || this.points[0], + // bottomPoint = topPoint + this.anchorHeight || this.points[1], + winHeight = window.innerHeight; + + if (this.options.stickTo === 'top') { + topPoint -= mTop; + bottomPoint -= elemHeight + mTop; + } else if (this.options.stickTo === 'bottom') { + topPoint -= winHeight - (elemHeight + mBtm); + bottomPoint -= winHeight - mBtm; + } else { + //this would be the stickTo: both option... tricky + } + + this.topPoint = topPoint; + this.bottomPoint = bottomPoint; + + if (cb && typeof cb === 'function') { + cb(); + } + } + + /** + * Destroys the current sticky element. + * Resets the element to the top position first. + * Removes event listeners, JS-added css properties and classes, and unwraps the $element if the JS added the $container. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this._removeSticky(true); + + this.$element.removeClass(this.options.stickyClass + ' is-anchored is-at-top').css({ + height: '', + top: '', + bottom: '', + 'max-width': '' + }).off('resizeme.zf.trigger').off('mutateme.zf.trigger'); + if (this.$anchor && this.$anchor.length) { + this.$anchor.off('change.zf.sticky'); + } + __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(this.scrollListener); + + if (this.wasWrapped) { + this.$element.unwrap(); + } else { + this.$container.removeClass(this.options.containerClass).css({ + height: '' + }); + } + } + }]); + + return Sticky; +}(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__["Plugin"]); + +Sticky.defaults = { + /** + * Customizable container template. Add your own classes for styling and sizing. + * @option + * @type {string} + * @default '<div data-sticky-container></div>' + */ + container: '
      ', + /** + * Location in the view the element sticks to. Can be `'top'` or `'bottom'`. + * @option + * @type {string} + * @default 'top' + */ + stickTo: 'top', + /** + * If anchored to a single element, the id of that element. + * @option + * @type {string} + * @default '' + */ + anchor: '', + /** + * If using more than one element as anchor points, the id of the top anchor. + * @option + * @type {string} + * @default '' + */ + topAnchor: '', + /** + * If using more than one element as anchor points, the id of the bottom anchor. + * @option + * @type {string} + * @default '' + */ + btmAnchor: '', + /** + * Margin, in `em`'s to apply to the top of the element when it becomes sticky. + * @option + * @type {number} + * @default 1 + */ + marginTop: 1, + /** + * Margin, in `em`'s to apply to the bottom of the element when it becomes sticky. + * @option + * @type {number} + * @default 1 + */ + marginBottom: 1, + /** + * Breakpoint string that is the minimum screen size an element should become sticky. + * @option + * @type {string} + * @default 'medium' + */ + stickyOn: 'medium', + /** + * Class applied to sticky element, and removed on destruction. Foundation defaults to `sticky`. + * @option + * @type {string} + * @default 'sticky' + */ + stickyClass: 'sticky', + /** + * Class applied to sticky container. Foundation defaults to `sticky-container`. + * @option + * @type {string} + * @default 'sticky-container' + */ + containerClass: 'sticky-container', + /** + * Number of scroll events between the plugin's recalculating sticky points. Setting it to `0` will cause it to recalc every scroll event, setting it to `-1` will prevent recalc on scroll. + * @option + * @type {number} + * @default -1 + */ + checkEvery: -1 +}; + +/** + * Helper function to calculate em values + * @param Number {em} - number of em's to calculate into pixels + */ +function emCalc(em) { + return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em; +} + + + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 96: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(30); + + +/***/ }) + +/******/ }); +/******/ + (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 = 97); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 10: +/***/ (function(module, exports) { + +module.exports = {onImagesLoaded: window.Foundation.onImagesLoaded}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 31: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_tabs__ = __webpack_require__(61); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_tabs__["a" /* Tabs */], 'Tabs'); + +/***/ }), + +/***/ 5: +/***/ (function(module, exports) { + +module.exports = {Keyboard: window.Foundation.Keyboard}; + +/***/ }), + +/***/ 61: +/***/ (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__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_keyboard__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__ = __webpack_require__(10); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_imageLoader__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__foundation_plugin__); + + +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__["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__["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__["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__["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' +}; + + + +/***/ }), + +/***/ 97: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(31); + + +/***/ }) + +/******/ }); +/******/ + (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 = 98); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 32: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_toggler__ = __webpack_require__(62); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_toggler__["a" /* Toggler */], 'Toggler'); + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 62: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Toggler; }); +/* 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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__ = __webpack_require__(7); + + +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; } + + + + + + +/** + * Toggler module. + * @module foundation.toggler + * @requires foundation.util.motion + * @requires foundation.util.triggers + */ + +var Toggler = function (_Plugin) { + _inherits(Toggler, _Plugin); + + function Toggler() { + _classCallCheck(this, Toggler); + + return _possibleConstructorReturn(this, (Toggler.__proto__ || Object.getPrototypeOf(Toggler)).apply(this, arguments)); + } + + _createClass(Toggler, [{ + key: '_setup', + + /** + * Creates a new instance of Toggler. + * @class + * @name Toggler + * @fires Toggler#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({}, Toggler.defaults, element.data(), options); + this.className = ''; + this.className = 'Toggler'; // ie9 back compat + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + this._init(); + this._events(); + } + + /** + * Initializes the Toggler plugin by parsing the toggle class from data-toggler, or animation classes from data-animate. + * @function + * @private + */ + + }, { + key: '_init', + value: function _init() { + var input; + // Parse animation classes if they were set + if (this.options.animate) { + input = this.options.animate.split(' '); + + this.animationIn = input[0]; + this.animationOut = input[1] || null; + } + // Otherwise, parse toggle class + else { + input = this.$element.data('toggler'); + // Allow for a . at the beginning of the string + this.className = input[0] === '.' ? input.slice(1) : input; + } + + // Add ARIA attributes to triggers + var id = this.$element[0].id; + __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-controls', id); + // If the target is hidden, add aria-hidden + this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true); + } + + /** + * Initializes events for the toggle trigger. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this)); + } + + /** + * Toggles the target class on the target element. An event is fired from the original trigger depending on if the resultant state was "on" or "off". + * @function + * @fires Toggler#on + * @fires Toggler#off + */ + + }, { + key: 'toggle', + value: function toggle() { + this[this.options.animate ? '_toggleAnimate' : '_toggleClass'](); + } + }, { + key: '_toggleClass', + value: function _toggleClass() { + this.$element.toggleClass(this.className); + + var isOn = this.$element.hasClass(this.className); + if (isOn) { + /** + * Fires if the target element has the class after a toggle. + * @event Toggler#on + */ + this.$element.trigger('on.zf.toggler'); + } else { + /** + * Fires if the target element does not have the class after a toggle. + * @event Toggler#off + */ + this.$element.trigger('off.zf.toggler'); + } + + this._updateARIA(isOn); + this.$element.find('[data-mutate]').trigger('mutateme.zf.trigger'); + } + }, { + key: '_toggleAnimate', + value: function _toggleAnimate() { + var _this = this; + + if (this.$element.is(':hidden')) { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["Motion"].animateIn(this.$element, this.animationIn, function () { + _this._updateARIA(true); + this.trigger('on.zf.toggler'); + this.find('[data-mutate]').trigger('mutateme.zf.trigger'); + }); + } else { + __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["Motion"].animateOut(this.$element, this.animationOut, function () { + _this._updateARIA(false); + this.trigger('off.zf.toggler'); + this.find('[data-mutate]').trigger('mutateme.zf.trigger'); + }); + } + } + }, { + key: '_updateARIA', + value: function _updateARIA(isOn) { + this.$element.attr('aria-expanded', isOn ? true : false); + } + + /** + * Destroys the instance of Toggler on the element. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.off('.zf.toggler'); + } + }]); + + return Toggler; +}(__WEBPACK_IMPORTED_MODULE_2__foundation_plugin__["Plugin"]); + +Toggler.defaults = { + /** + * Tells the plugin if the element should animated when toggled. + * @option + * @type {boolean} + * @default false + */ + animate: false +}; + + + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 98: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(32); + + +/***/ }) + +/******/ }); +/******/ + (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 = 99); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +module.exports = jQuery; + +/***/ }), + +/***/ 1: +/***/ (function(module, exports) { + +module.exports = {Foundation: window.Foundation}; + +/***/ }), + +/***/ 11: +/***/ (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__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_box___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); + + +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__["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__["Box"].GetDimensions($element), + $anchorDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetDimensions($anchor); + + $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["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__["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__["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__["Box"].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset())); + } + } + }]); + + return Positionable; +}(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__["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 +}; + + + +/***/ }), + +/***/ 2: +/***/ (function(module, exports) { + +module.exports = {Plugin: window.Foundation.Plugin}; + +/***/ }), + +/***/ 3: +/***/ (function(module, exports) { + +module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; + +/***/ }), + +/***/ 33: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_tooltip__ = __webpack_require__(63); + + + +__WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_tooltip__["a" /* Tooltip */], 'Tooltip'); + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; + +/***/ }), + +/***/ 6: +/***/ (function(module, exports) { + +module.exports = {MediaQuery: window.Foundation.MediaQuery}; + +/***/ }), + +/***/ 63: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Tooltip; }); +/* 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__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__ = __webpack_require__(7); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_positionable__ = __webpack_require__(11); + + +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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +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; } + + + + + + + + +/** + * Tooltip module. + * @module foundation.tooltip + * @requires foundation.util.box + * @requires foundation.util.mediaQuery + * @requires foundation.util.triggers + */ + +var Tooltip = function (_Positionable) { + _inherits(Tooltip, _Positionable); + + function Tooltip() { + _classCallCheck(this, Tooltip); + + return _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).apply(this, arguments)); + } + + _createClass(Tooltip, [{ + key: '_setup', + + /** + * Creates a new instance of a Tooltip. + * @class + * @name Tooltip + * @fires Tooltip#init + * @param {jQuery} element - jQuery object to attach a tooltip to. + * @param {Object} options - object to extend the default configuration. + */ + value: function _setup(element, options) { + this.$element = element; + this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Tooltip.defaults, this.$element.data(), options); + this.className = 'Tooltip'; // ie9 back compat + + this.isActive = false; + this.isClick = false; + + // Triggers init is idempotent, just need to make sure it is initialized + __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); + + this._init(); + } + + /** + * Initializes the tooltip by setting the creating the tip element, adding it's text, setting private variables and setting attributes on the anchor. + * @private + */ + + }, { + key: '_init', + value: function _init() { + __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"]._init(); + var elemId = this.$element.attr('aria-describedby') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["GetYoDigits"])(6, 'tooltip'); + + this.options.tipText = this.options.tipText || this.$element.attr('title'); + this.template = this.options.template ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.options.template) : this._buildTemplate(elemId); + + if (this.options.allowHtml) { + this.template.appendTo(document.body).html(this.options.tipText).hide(); + } else { + this.template.appendTo(document.body).text(this.options.tipText).hide(); + } + + this.$element.attr({ + 'title': '', + 'aria-describedby': elemId, + 'data-yeti-box': elemId, + 'data-toggle': elemId, + 'data-resize': elemId + }).addClass(this.options.triggerClass); + + _get(Tooltip.prototype.__proto__ || Object.getPrototypeOf(Tooltip.prototype), '_init', this).call(this); + this._events(); + } + }, { + key: '_getDefaultPosition', + value: function _getDefaultPosition() { + // handle legacy classnames + var position = this.$element[0].className.match(/\b(top|left|right|bottom)\b/g); + return position ? position[0] : 'top'; + } + }, { + key: '_getDefaultAlignment', + value: function _getDefaultAlignment() { + return 'center'; + } + }, { + key: '_getHOffset', + value: function _getHOffset() { + if (this.position === 'left' || this.position === 'right') { + return this.options.hOffset + this.options.tooltipWidth; + } else { + return this.options.hOffset; + } + } + }, { + key: '_getVOffset', + value: function _getVOffset() { + if (this.position === 'top' || this.position === 'bottom') { + return this.options.vOffset + this.options.tooltipHeight; + } else { + return this.options.vOffset; + } + } + + /** + * builds the tooltip element, adds attributes, and returns the template. + * @private + */ + + }, { + key: '_buildTemplate', + value: function _buildTemplate(id) { + var templateClasses = (this.options.tooltipClass + ' ' + this.options.positionClass + ' ' + this.options.templateClasses).trim(); + var $template = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
      ').addClass(templateClasses).attr({ + 'role': 'tooltip', + 'aria-hidden': true, + 'data-is-active': false, + 'data-is-focus': false, + 'id': id + }); + return $template; + } + + /** + * sets the position class of an element and recursively calls itself until there are no more possible positions to attempt, or the tooltip element is no longer colliding. + * if the tooltip is larger than the screen width, default to full width - any user selected margin + * @private + */ + + }, { + key: '_setPosition', + value: function _setPosition() { + _get(Tooltip.prototype.__proto__ || Object.getPrototypeOf(Tooltip.prototype), '_setPosition', this).call(this, this.$element, this.template); + } + + /** + * reveals the tooltip, and fires an event to close any other open tooltips on the page + * @fires Tooltip#closeme + * @fires Tooltip#show + * @function + */ + + }, { + key: 'show', + value: function show() { + if (this.options.showOn !== 'all' && !__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].is(this.options.showOn)) { + // console.error('The screen is too small to display this tooltip'); + return false; + } + + var _this = this; + this.template.css('visibility', 'hidden').show(); + this._setPosition(); + this.template.removeClass('top bottom left right').addClass(this.position); + this.template.removeClass('align-top align-bottom align-left align-right align-center').addClass('align-' + this.alignment); + + /** + * Fires to close all other open tooltips on the page + * @event Closeme#tooltip + */ + this.$element.trigger('closeme.zf.tooltip', this.template.attr('id')); + + this.template.attr({ + 'data-is-active': true, + 'aria-hidden': false + }); + _this.isActive = true; + // console.log(this.template); + this.template.stop().hide().css('visibility', '').fadeIn(this.options.fadeInDuration, function () { + //maybe do stuff? + }); + /** + * Fires when the tooltip is shown + * @event Tooltip#show + */ + this.$element.trigger('show.zf.tooltip'); + } + + /** + * Hides the current tooltip, and resets the positioning class if it was changed due to collision + * @fires Tooltip#hide + * @function + */ + + }, { + key: 'hide', + value: function hide() { + // console.log('hiding', this.$element.data('yeti-box')); + var _this = this; + this.template.stop().attr({ + 'aria-hidden': true, + 'data-is-active': false + }).fadeOut(this.options.fadeOutDuration, function () { + _this.isActive = false; + _this.isClick = false; + }); + /** + * fires when the tooltip is hidden + * @event Tooltip#hide + */ + this.$element.trigger('hide.zf.tooltip'); + } + + /** + * adds event listeners for the tooltip and its anchor + * TODO combine some of the listeners like focus and mouseenter, etc. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + var $template = this.template; + var isFocus = false; + + if (!this.options.disableHover) { + + this.$element.on('mouseenter.zf.tooltip', function (e) { + if (!_this.isActive) { + _this.timeout = setTimeout(function () { + _this.show(); + }, _this.options.hoverDelay); + } + }).on('mouseleave.zf.tooltip', function (e) { + clearTimeout(_this.timeout); + if (!isFocus || _this.isClick && !_this.options.clickOpen) { + _this.hide(); + } + }); + } + + if (this.options.clickOpen) { + this.$element.on('mousedown.zf.tooltip', function (e) { + e.stopImmediatePropagation(); + if (_this.isClick) { + //_this.hide(); + // _this.isClick = false; + } else { + _this.isClick = true; + if ((_this.options.disableHover || !_this.$element.attr('tabindex')) && !_this.isActive) { + _this.show(); + } + } + }); + } else { + this.$element.on('mousedown.zf.tooltip', function (e) { + e.stopImmediatePropagation(); + _this.isClick = true; + }); + } + + if (!this.options.disableForTouch) { + this.$element.on('tap.zf.tooltip touchend.zf.tooltip', function (e) { + _this.isActive ? _this.hide() : _this.show(); + }); + } + + this.$element.on({ + // 'toggle.zf.trigger': this.toggle.bind(this), + // 'close.zf.trigger': this.hide.bind(this) + 'close.zf.trigger': this.hide.bind(this) + }); + + this.$element.on('focus.zf.tooltip', function (e) { + isFocus = true; + if (_this.isClick) { + // If we're not showing open on clicks, we need to pretend a click-launched focus isn't + // a real focus, otherwise on hover and come back we get bad behavior + if (!_this.options.clickOpen) { + isFocus = false; + } + return false; + } else { + _this.show(); + } + }).on('focusout.zf.tooltip', function (e) { + isFocus = false; + _this.isClick = false; + _this.hide(); + }).on('resizeme.zf.trigger', function () { + if (_this.isActive) { + _this._setPosition(); + } + }); + } + + /** + * adds a toggle method, in addition to the static show() & hide() functions + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.isActive) { + this.hide(); + } else { + this.show(); + } + } + + /** + * Destroys an instance of tooltip, removes template element from the view. + * @function + */ + + }, { + key: '_destroy', + value: function _destroy() { + this.$element.attr('title', this.template.text()).off('.zf.trigger .zf.tooltip').removeClass('has-tip top right left').removeAttr('aria-describedby aria-haspopup data-disable-hover data-resize data-toggle data-tooltip data-yeti-box'); + + this.template.remove(); + } + }]); + + return Tooltip; +}(__WEBPACK_IMPORTED_MODULE_4__foundation_positionable__["a" /* Positionable */]); + +Tooltip.defaults = { + disableForTouch: false, + /** + * Time, in ms, before a tooltip should open on hover. + * @option + * @type {number} + * @default 200 + */ + hoverDelay: 200, + /** + * Time, in ms, a tooltip should take to fade into view. + * @option + * @type {number} + * @default 150 + */ + fadeInDuration: 150, + /** + * Time, in ms, a tooltip should take to fade out of view. + * @option + * @type {number} + * @default 150 + */ + fadeOutDuration: 150, + /** + * Disables hover events from opening the tooltip if set to true + * @option + * @type {boolean} + * @default false + */ + disableHover: false, + /** + * Optional addtional classes to apply to the tooltip template on init. + * @option + * @type {string} + * @default '' + */ + templateClasses: '', + /** + * Non-optional class added to tooltip templates. Foundation default is 'tooltip'. + * @option + * @type {string} + * @default 'tooltip' + */ + tooltipClass: 'tooltip', + /** + * Class applied to the tooltip anchor element. + * @option + * @type {string} + * @default 'has-tip' + */ + triggerClass: 'has-tip', + /** + * Minimum breakpoint size at which to open the tooltip. + * @option + * @type {string} + * @default 'small' + */ + showOn: 'small', + /** + * Custom template to be used to generate markup for tooltip. + * @option + * @type {string} + * @default '' + */ + template: '', + /** + * Text displayed in the tooltip template on open. + * @option + * @type {string} + * @default '' + */ + tipText: '', + touchCloseText: 'Tap to close.', + /** + * Allows the tooltip to remain open if triggered with a click or touch event. + * @option + * @type {boolean} + * @default true + */ + clickOpen: true, + /** + * DEPRECATED Additional positioning classes, set by the JS + * @option + * @type {string} + * @default '' + */ + positionClass: '', + /** + * Position of tooltip. Can be left, right, bottom, top, or auto. + * @option + * @type {string} + * @default 'auto' + */ + position: 'auto', + /** + * Alignment of tooltip 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, tooltip will 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. + * Less common for tooltips. + * @option + * @type {boolean} + * @default false + */ + allowBottomOverlap: false, + /** + * Distance, in pixels, the template should push away from the anchor on the Y axis. + * @option + * @type {number} + * @default 0 + */ + vOffset: 0, + /** + * Distance, in pixels, the template should push away from the anchor on the X axis + * @option + * @type {number} + * @default 0 + */ + hOffset: 0, + /** + * Distance, in pixels, the template spacing auto-adjust for a vertical tooltip + * @option + * @type {number} + * @default 14 + */ + tooltipHeight: 14, + /** + * Distance, in pixels, the template spacing auto-adjust for a horizontal tooltip + * @option + * @type {number} + * @default 12 + */ + tooltipWidth: 12, + /** + * Allow HTML in tooltip. Warning: If you are loading user-generated content into tooltips, + * allowing HTML may open yourself up to XSS attacks. + * @option + * @type {boolean} + * @default false + */ + allowHtml: false +}; + +/** + * TODO utilize resize event trigger + */ + + + +/***/ }), + +/***/ 7: +/***/ (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__(4); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); + + + + + +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__["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; + } +}; + + + +/***/ }), + +/***/ 8: +/***/ (function(module, exports) { + +module.exports = {Box: window.Foundation.Box}; + +/***/ }), + +/***/ 99: +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(33); + + +/***/ }) + +/******/ }); +'use strict'; + +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 ($) { + + /** + * ResponsiveAccordionTabs module. + * @module foundation.responsiveAccordionTabs + * @requires foundation.util.keyboard + * @requires foundation.util.timerAndImageLoader + * @requires foundation.util.motion + * @requires foundation.accordion + * @requires foundation.tabs + */ + + var ResponsiveAccordionTabs = function () { + /** + * Creates a new instance of a responsive accordion tabs. + * @class + * @fires ResponsiveAccordionTabs#init + * @param {jQuery} element - jQuery object to make into a dropdown menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function ResponsiveAccordionTabs(element, options) { + _classCallCheck(this, ResponsiveAccordionTabs); + + this.$element = $(element); + this.options = $.extend({}, this.$element.data(), options); + this.rules = this.$element.data('responsive-accordion-tabs'); + this.currentMq = null; + this.currentPlugin = null; + if (!this.$element.attr('id')) { + this.$element.attr('id', Foundation.GetYoDigits(6, 'responsiveaccordiontabs')); + }; + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'ResponsiveAccordionTabs'); + } + + /** + * Initializes the Menu by parsing the classes from the 'data-responsive-accordion-tabs' attribute on the element. + * @function + * @private + */ + + + _createClass(ResponsiveAccordionTabs, [{ + key: '_init', + value: function _init() { + // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules + if (typeof this.rules === 'string') { + var rulesTree = {}; + + // Parse rules from "classes" pulled from data attribute + var rules = this.rules.split(' '); + + // Iterate through every rule found + for (var i = 0; i < rules.length; i++) { + var rule = rules[i].split('-'); + var ruleSize = rule.length > 1 ? rule[0] : 'small'; + var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; + + if (MenuPlugins[rulePlugin] !== null) { + rulesTree[ruleSize] = MenuPlugins[rulePlugin]; + } + } + + this.rules = rulesTree; + } + + this._getAllOptions(); + + if (!$.isEmptyObject(this.rules)) { + this._checkMediaQueries(); + } + } + }, { + key: '_getAllOptions', + value: function _getAllOptions() { + //get all defaults and options + var _this = this; + _this.allOptions = {}; + for (var key in MenuPlugins) { + if (MenuPlugins.hasOwnProperty(key)) { + var obj = MenuPlugins[key]; + try { + var dummyPlugin = $('
        '); + var tmpPlugin = new obj.plugin(dummyPlugin, _this.options); + for (var keyKey in tmpPlugin.options) { + if (tmpPlugin.options.hasOwnProperty(keyKey) && keyKey !== 'zfPlugin') { + var objObj = tmpPlugin.options[keyKey]; + _this.allOptions[keyKey] = objObj; + } + } + tmpPlugin.destroy(); + } catch (e) {} + } + } + } + + /** + * Initializes events for the Menu. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + $(window).on('changed.zf.mediaquery', function () { + _this._checkMediaQueries(); + }); + } + + /** + * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. + * @function + * @private + */ + + }, { + key: '_checkMediaQueries', + value: function _checkMediaQueries() { + var matchedMq, + _this = this; + // Iterate through each rule and find the last matching rule + $.each(this.rules, function (key) { + if (Foundation.MediaQuery.atLeast(key)) { + matchedMq = key; + } + }); + + // No match? No dice + if (!matchedMq) return; + + // Plugin already initialized? We good + if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; + + // Remove existing plugin-specific CSS classes + $.each(MenuPlugins, function (key, value) { + _this.$element.removeClass(value.cssClass); + }); + + // Add the CSS class for the new plugin + this.$element.addClass(this.rules[matchedMq].cssClass); + + // Create an instance of the new plugin + if (this.currentPlugin) { + //don't know why but on nested elements data zfPlugin get's lost + if (!this.currentPlugin.$element.data('zfPlugin') && this.storezfData) this.currentPlugin.$element.data('zfPlugin', this.storezfData); + this.currentPlugin.destroy(); + } + this._handleMarkup(this.rules[matchedMq].cssClass); + this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); + this.storezfData = this.currentPlugin.$element.data('zfPlugin'); + } + }, { + key: '_handleMarkup', + value: function _handleMarkup(toSet) { + var _this = this, + fromString = 'accordion'; + var $panels = $('[data-tabs-content=' + this.$element.attr('id') + ']'); + if ($panels.length) fromString = 'tabs'; + if (fromString === toSet) { + return; + }; + + var tabsTitle = _this.allOptions.linkClass ? _this.allOptions.linkClass : 'tabs-title'; + var tabsPanel = _this.allOptions.panelClass ? _this.allOptions.panelClass : 'tabs-panel'; + + this.$element.removeAttr('role'); + var $liHeads = this.$element.children('.' + tabsTitle + ',[data-accordion-item]').removeClass(tabsTitle).removeClass('accordion-item').removeAttr('data-accordion-item'); + var $liHeadsA = $liHeads.children('a').removeClass('accordion-title'); + + if (fromString === 'tabs') { + $panels = $panels.children('.' + tabsPanel).removeClass(tabsPanel).removeAttr('role').removeAttr('aria-hidden').removeAttr('aria-labelledby'); + $panels.children('a').removeAttr('role').removeAttr('aria-controls').removeAttr('aria-selected'); + } else { + $panels = $liHeads.children('[data-tab-content]').removeClass('accordion-content'); + }; + + $panels.css({ display: '', visibility: '' }); + $liHeads.css({ display: '', visibility: '' }); + if (toSet === 'accordion') { + $panels.each(function (key, value) { + $(value).appendTo($liHeads.get(key)).addClass('accordion-content').attr('data-tab-content', '').removeClass('is-active').css({ height: '' }); + $('[data-tabs-content=' + _this.$element.attr('id') + ']').after('
        ').remove(); + $liHeads.addClass('accordion-item').attr('data-accordion-item', ''); + $liHeadsA.addClass('accordion-title'); + }); + } else if (toSet === 'tabs') { + var $tabsContent = $('[data-tabs-content=' + _this.$element.attr('id') + ']'); + var $placeholder = $('#tabs-placeholder-' + _this.$element.attr('id')); + if ($placeholder.length) { + $tabsContent = $('
        ').insertAfter($placeholder).attr('data-tabs-content', _this.$element.attr('id')); + $placeholder.remove(); + } else { + $tabsContent = $('
        ').insertAfter(_this.$element).attr('data-tabs-content', _this.$element.attr('id')); + }; + $panels.each(function (key, value) { + var tempValue = $(value).appendTo($tabsContent).addClass(tabsPanel); + var hash = $liHeadsA.get(key).hash.slice(1); + var id = $(value).attr('id') || Foundation.GetYoDigits(6, 'accordion'); + if (hash !== id) { + if (hash !== '') { + $(value).attr('id', hash); + } else { + hash = id; + $(value).attr('id', hash); + $($liHeadsA.get(key)).attr('href', $($liHeadsA.get(key)).attr('href').replace('#', '') + '#' + hash); + }; + }; + var isActive = $($liHeads.get(key)).hasClass('is-active'); + if (isActive) { + tempValue.addClass('is-active'); + }; + }); + $liHeads.addClass(tabsTitle); + }; + } + + /** + * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + if (this.currentPlugin) this.currentPlugin.destroy(); + $(window).off('.zf.ResponsiveAccordionTabs'); + Foundation.unregisterPlugin(this); + } + }]); + + return ResponsiveAccordionTabs; + }(); + + ResponsiveAccordionTabs.defaults = {}; + + // The plugin matches the plugin classes with these plugin instances. + var MenuPlugins = { + tabs: { + cssClass: 'tabs', + plugin: Foundation._plugins.tabs || null + }, + accordion: { + cssClass: 'accordion', + plugin: Foundation._plugins.accordion || null + } + }; + + // Window exports + Foundation.plugin(ResponsiveAccordionTabs, 'ResponsiveAccordionTabs'); +}(jQuery); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* +Turbolinks 5.0.3 +Copyright © 2017 Basecamp, LLC + */ + +(function(){(function(){(function(){this.Turbolinks={supported:function(){return null!=window.history.pushState&&null!=window.requestAnimationFrame&&null!=window.addEventListener}(),visit:function(e,r){return t.controller.visit(e,r)},clearCache:function(){return t.controller.clearCache()}}}).call(this)}).call(this);var t=this.Turbolinks;(function(){(function(){var e,r,n=[].slice;t.copyObject=function(t){var e,r,n;r={};for(e in t)n=t[e],r[e]=n;return r},t.closest=function(t,r){return e.call(t,r)},e=function(){var t,e;return t=document.documentElement,null!=(e=t.closest)?e:function(t){var e;for(e=this;e;){if(e.nodeType===Node.ELEMENT_NODE&&r.call(e,t))return e;e=e.parentNode}}}(),t.defer=function(t){return setTimeout(t,1)},t.throttle=function(t){var e;return e=null,function(){var r;return r=1<=arguments.length?n.call(arguments,0):[],null!=e?e:e=requestAnimationFrame(function(n){return function(){return e=null,t.apply(n,r)}}(this))}},t.dispatch=function(t,e){var r,n,o,i,s;return i=null!=e?e:{},s=i.target,r=i.cancelable,n=i.data,o=document.createEvent("Events"),o.initEvent(t,!0,r===!0),o.data=null!=n?n:{},(null!=s?s:document).dispatchEvent(o),o},t.match=function(t,e){return r.call(t,e)},r=function(){var t,e,r,n;return t=document.documentElement,null!=(e=null!=(r=null!=(n=t.matchesSelector)?n:t.webkitMatchesSelector)?r:t.msMatchesSelector)?e:t.mozMatchesSelector}(),t.uuid=function(){var t,e,r;for(r="",t=e=1;36>=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){t.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.absoluteURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=e(this.requestCanceled,this),this.requestTimedOut=e(this.requestTimedOut,this),this.requestFailed=e(this.requestFailed,this),this.requestLoaded=e(this.requestLoaded,this),this.requestProgressed=e(this.requestProgressed,this),this.url=t.Location.wrap(n).requestURL,this.referrer=t.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return t.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return t.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.ProgressBar=function(){function t(){this.trickle=e(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,t.defaultCSS=".turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n transform: translate3d(0, 0, 0);\n}",t.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},t.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},t.prototype.setValue=function(t){return this.value=t,this.refresh()},t.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},t.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},t.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},t.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},t.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},t.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},t.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},t.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},t.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},t.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},t}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=e(this.showProgressBar,this),this.progressBar=new t.ProgressBar}var n,o,i,s;return s=t.HttpRequest,n=s.NETWORK_FAILURE,i=s.TIMEOUT_FAILURE,o=500,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case i:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,o)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.History=function(){function r(t){this.delegate=t,this.onPageLoad=e(this.onPageLoad,this),this.onPopState=e(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(e,r){return e=t.Location.wrap(e),this.update("push",e,r)},r.prototype.replace=function(e,r){return e=t.Location.wrap(e),this.update("replace",e,r)},r.prototype.onPopState=function(e){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=e.state)?n.turbolinks:void 0)?(r=t.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(e){return t.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){t.Snapshot=function(){function e(t){var e,r;r=t.head,e=t.body,this.head=null!=r?r:document.createElement("head"),this.body=null!=e?e:document.createElement("body")}return e.wrap=function(t){return t instanceof this?t:this.fromHTML(t)},e.fromHTML=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromElement(e)},e.fromElement=function(t){return new this({head:t.querySelector("head"),body:t.querySelector("body")})},e.prototype.clone=function(){return new e({head:this.head.cloneNode(!0),body:this.body.cloneNode(!0)})},e.prototype.getRootLocation=function(){var e,r;return r=null!=(e=this.getSetting("root"))?e:"/",new t.Location(r)},e.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},e.prototype.hasAnchor=function(t){try{return null!=this.body.querySelector("[id='"+t+"']")}catch(e){}},e.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},e.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},e.prototype.getSetting=function(t){var e,r;return r=this.head.querySelectorAll("meta[name='turbolinks-"+t+"']"),e=r[r.length-1],null!=e?e.getAttribute("content"):void 0},e}()}.call(this),function(){var e=[].slice;t.Renderer=function(){function t(){}var r;return t.render=function(){var t,r,n,o;return n=arguments[0],r=arguments[1],t=3<=arguments.length?e.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,t,function(){}),o.delegate=n,o.render(r),o},t.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},t.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},t.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},t}()}.call(this),function(){t.HeadDetails=function(){function t(t){var e,r,i,s,a,u,l;for(this.element=t,this.elements={},l=this.element.childNodes,s=0,u=l.length;u>s;s++)i=l[s],i.nodeType===Node.ELEMENT_NODE&&(a=i.outerHTML,r=null!=(e=this.elements)[a]?e[a]:e[a]={type:o(i),tracked:n(i),elements:[]},r.elements.push(i))}var e,r,n,o;return t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},o=function(t){return e(t)?"script":r(t)?"stylesheet":void 0},n=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},e=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},r=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},t}()}.call(this),function(){var e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t.SnapshotRenderer=function(r){function n(e,r){this.currentSnapshot=e,this.newSnapshot=r,this.currentHeadDetails=new t.HeadDetails(this.currentSnapshot.head),this.newHeadDetails=new t.HeadDetails(this.newSnapshot.head),this.newBody=this.newSnapshot.body}return e(n,r),n.prototype.render=function(t){return this.trackedElementsAreIdentical()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},n.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},n.prototype.replaceBody=function(){return this.activateBodyScriptElements(),this.importBodyPermanentElements(),this.assignNewBody()},n.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},n.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},n.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},n.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},n.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},n.prototype.importBodyPermanentElements=function(){var t,e,r,n,o,i;for(n=this.getNewBodyPermanentElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],(t=this.findCurrentBodyPermanentElement(o))?i.push(o.parentNode.replaceChild(t,o)):i.push(void 0);return i},n.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getNewBodyScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},n.prototype.assignNewBody=function(){return document.body=this.newBody},n.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.findFirstAutofocusableElement())?t.focus():void 0},n.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},n.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},n.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},n.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},n.prototype.getNewBodyPermanentElements=function(){return this.newBody.querySelectorAll("[id][data-turbolinks-permanent]")},n.prototype.findCurrentBodyPermanentElement=function(t){return document.body.querySelector("#"+t.id+"[data-turbolinks-permanent]")},n.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},n.prototype.findFirstAutofocusableElement=function(){return document.body.querySelector("[autofocus]")},n}(t.Renderer)}.call(this),function(){var e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t.ErrorRenderer=function(t){function r(t){this.html=t}return e(r,t),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceDocumentHTML(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceDocumentHTML=function(){return document.documentElement.innerHTML=this.html},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(t.Renderer)}.call(this),function(){t.View=function(){function e(t){this.delegate=t,this.element=document.documentElement}return e.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},e.prototype.getSnapshot=function(){return t.Snapshot.fromElement(this.element)},e.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,e):this.renderError(r,e)},e.prototype.markAsPreview=function(t){return t?this.element.setAttribute("data-turbolinks-preview",""):this.element.removeAttribute("data-turbolinks-preview")},e.prototype.renderSnapshot=function(e,r){return t.SnapshotRenderer.render(this.delegate,r,this.getSnapshot(),t.Snapshot.wrap(e))},e.prototype.renderError=function(e,r){return t.ErrorRenderer.render(this.delegate,r,e)},e}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=e(this.onScroll,this),this.onScroll=t.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){t.SnapshotCache=function(){function e(t){this.size=t,this.keys=[],this.snapshots={}}var r;return e.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},e.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},e.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},e.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},e.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},e.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},e.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(e){return t.Location.wrap(e).toCacheKey()},e}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=e(this.performScroll,this),this.identifier=t.uuid(),this.location=t.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new t.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(e,r){return this.response=e,null!=r&&(this.redirectedToLocation=t.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return t.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var e=function(t,e){return function(){return t.apply(e,arguments)}};t.Controller=function(){function r(){this.clickBubbled=e(this.clickBubbled,this),this.clickCaptured=e(this.clickCaptured,this),this.pageLoaded=e(this.pageLoaded,this),this.history=new t.History(this),this.view=new t.View(this),this.scrollManager=new t.ScrollManager(this),this.restorationData={},this.clearCache()}return r.prototype.start=function(){return t.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new t.SnapshotCache(10)},r.prototype.visit=function(e,r){var n,o;return null==r&&(r={}),e=t.Location.wrap(e),this.applicationAllowsVisitingLocation(e)?this.locationIsVisitable(e)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(e,n)):window.location=e:void 0},r.prototype.startVisitToLocationWithAction=function(e,r,n){var o;return t.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(e,r,{restorationData:o})):window.location=e},r.prototype.startHistory=function(){return this.location=t.Location.wrap(window.location),this.restorationIdentifier=t.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(e,r){return this.restorationIdentifier=r,this.location=t.Location.wrap(e),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(e,r){return this.restorationIdentifier=r,this.location=t.Location.wrap(e),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(e,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(e,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=t.Location.wrap(e)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return e=this.cache.get(t),e?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable()},r.prototype.cacheSnapshot=function(){var t;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),t=this.view.getSnapshot(),this.cache.put(this.lastRenderedLocation,t.clone())):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=document.getElementById(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(e,r){return t.dispatch("turbolinks:click",{target:e,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(e){return t.dispatch("turbolinks:before-visit",{data:{url:e.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(e){return t.dispatch("turbolinks:visit",{data:{url:e.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return t.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(e){ +return t.dispatch("turbolinks:before-render",{data:{newBody:e}})},r.prototype.notifyApplicationAfterRender=function(){return t.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(e){return null==e&&(e={}),t.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:e}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(e,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new t.Visit(this,e,r),u.restorationIdentifier=null!=a?a:t.uuid(),u.restorationData=t.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(e){return this.nodeIsVisitable(e)?t.closest(e,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(e){var r;return r=new t.Location(e.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(e){var r;return(r=t.closest(e,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){var e,r,n;t.start=function(){return r()?(null==t.controller&&(t.controller=e()),t.controller.start()):void 0},r=function(){return null==window.Turbolinks&&(window.Turbolinks=t),n()},e=function(){var e;return e=new t.Controller,e.adapter=new t.BrowserAdapter(e),e},n=function(){return window.Turbolinks===t},n()&&t.start()}.call(this)}).call(this),"object"==typeof module&&module.exports?module.exports=t:"function"==typeof define&&define.amd&&define(t)}).call(this); +(function() { + var context = this; + + (function() { + (function() { + var slice = [].slice; + + this.ActionCable = { + INTERNAL: { + "message_types": { + "welcome": "welcome", + "ping": "ping", + "confirmation": "confirm_subscription", + "rejection": "reject_subscription" + }, + "default_mount_path": "/cable", + "protocols": ["actioncable-v1-json", "actioncable-unsupported"] + }, + WebSocket: window.WebSocket, + logger: window.console, + createConsumer: function(url) { + var ref; + if (url == null) { + url = (ref = this.getConfig("url")) != null ? ref : this.INTERNAL.default_mount_path; + } + return new ActionCable.Consumer(this.createWebSocketURL(url)); + }, + getConfig: function(name) { + var element; + element = document.head.querySelector("meta[name='action-cable-" + name + "']"); + return element != null ? element.getAttribute("content") : void 0; + }, + createWebSocketURL: function(url) { + var a; + if (url && !/^wss?:/i.test(url)) { + a = document.createElement("a"); + a.href = url; + a.href = a.href; + a.protocol = a.protocol.replace("http", "ws"); + return a.href; + } else { + return url; + } + }, + startDebugging: function() { + return this.debugging = true; + }, + stopDebugging: function() { + return this.debugging = null; + }, + log: function() { + var messages, ref; + messages = 1 <= arguments.length ? slice.call(arguments, 0) : []; + if (this.debugging) { + messages.push(Date.now()); + return (ref = this.logger).log.apply(ref, ["[ActionCable]"].concat(slice.call(messages))); + } + } + }; + + }).call(this); + }).call(context); + + var ActionCable = context.ActionCable; + + (function() { + (function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + ActionCable.ConnectionMonitor = (function() { + var clamp, now, secondsSince; + + ConnectionMonitor.pollInterval = { + min: 3, + max: 30 + }; + + ConnectionMonitor.staleThreshold = 6; + + function ConnectionMonitor(connection) { + this.connection = connection; + this.visibilityDidChange = bind(this.visibilityDidChange, this); + this.reconnectAttempts = 0; + } + + ConnectionMonitor.prototype.start = function() { + if (!this.isRunning()) { + this.startedAt = now(); + delete this.stoppedAt; + this.startPolling(); + document.addEventListener("visibilitychange", this.visibilityDidChange); + return ActionCable.log("ConnectionMonitor started. pollInterval = " + (this.getPollInterval()) + " ms"); + } + }; + + ConnectionMonitor.prototype.stop = function() { + if (this.isRunning()) { + this.stoppedAt = now(); + this.stopPolling(); + document.removeEventListener("visibilitychange", this.visibilityDidChange); + return ActionCable.log("ConnectionMonitor stopped"); + } + }; + + ConnectionMonitor.prototype.isRunning = function() { + return (this.startedAt != null) && (this.stoppedAt == null); + }; + + ConnectionMonitor.prototype.recordPing = function() { + return this.pingedAt = now(); + }; + + ConnectionMonitor.prototype.recordConnect = function() { + this.reconnectAttempts = 0; + this.recordPing(); + delete this.disconnectedAt; + return ActionCable.log("ConnectionMonitor recorded connect"); + }; + + ConnectionMonitor.prototype.recordDisconnect = function() { + this.disconnectedAt = now(); + return ActionCable.log("ConnectionMonitor recorded disconnect"); + }; + + ConnectionMonitor.prototype.startPolling = function() { + this.stopPolling(); + return this.poll(); + }; + + ConnectionMonitor.prototype.stopPolling = function() { + return clearTimeout(this.pollTimeout); + }; + + ConnectionMonitor.prototype.poll = function() { + return this.pollTimeout = setTimeout((function(_this) { + return function() { + _this.reconnectIfStale(); + return _this.poll(); + }; + })(this), this.getPollInterval()); + }; + + ConnectionMonitor.prototype.getPollInterval = function() { + var interval, max, min, ref; + ref = this.constructor.pollInterval, min = ref.min, max = ref.max; + interval = 5 * Math.log(this.reconnectAttempts + 1); + return Math.round(clamp(interval, min, max) * 1000); + }; + + ConnectionMonitor.prototype.reconnectIfStale = function() { + if (this.connectionIsStale()) { + ActionCable.log("ConnectionMonitor detected stale connection. reconnectAttempts = " + this.reconnectAttempts + ", pollInterval = " + (this.getPollInterval()) + " ms, time disconnected = " + (secondsSince(this.disconnectedAt)) + " s, stale threshold = " + this.constructor.staleThreshold + " s"); + this.reconnectAttempts++; + if (this.disconnectedRecently()) { + return ActionCable.log("ConnectionMonitor skipping reopening recent disconnect"); + } else { + ActionCable.log("ConnectionMonitor reopening"); + return this.connection.reopen(); + } + } + }; + + ConnectionMonitor.prototype.connectionIsStale = function() { + var ref; + return secondsSince((ref = this.pingedAt) != null ? ref : this.startedAt) > this.constructor.staleThreshold; + }; + + ConnectionMonitor.prototype.disconnectedRecently = function() { + return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold; + }; + + ConnectionMonitor.prototype.visibilityDidChange = function() { + if (document.visibilityState === "visible") { + return setTimeout((function(_this) { + return function() { + if (_this.connectionIsStale() || !_this.connection.isOpen()) { + ActionCable.log("ConnectionMonitor reopening stale connection on visibilitychange. visbilityState = " + document.visibilityState); + return _this.connection.reopen(); + } + }; + })(this), 200); + } + }; + + now = function() { + return new Date().getTime(); + }; + + secondsSince = function(time) { + return (now() - time) / 1000; + }; + + clamp = function(number, min, max) { + return Math.max(min, Math.min(max, number)); + }; + + return ConnectionMonitor; + + })(); + + }).call(this); + (function() { + var i, message_types, protocols, ref, supportedProtocols, unsupportedProtocol, + slice = [].slice, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + ref = ActionCable.INTERNAL, message_types = ref.message_types, protocols = ref.protocols; + + supportedProtocols = 2 <= protocols.length ? slice.call(protocols, 0, i = protocols.length - 1) : (i = 0, []), unsupportedProtocol = protocols[i++]; + + ActionCable.Connection = (function() { + Connection.reopenDelay = 500; + + function Connection(consumer) { + this.consumer = consumer; + this.open = bind(this.open, this); + this.subscriptions = this.consumer.subscriptions; + this.monitor = new ActionCable.ConnectionMonitor(this); + this.disconnected = true; + } + + Connection.prototype.send = function(data) { + if (this.isOpen()) { + this.webSocket.send(JSON.stringify(data)); + return true; + } else { + return false; + } + }; + + Connection.prototype.open = function() { + if (this.isActive()) { + ActionCable.log("Attempted to open WebSocket, but existing socket is " + (this.getState())); + return false; + } else { + ActionCable.log("Opening WebSocket, current state is " + (this.getState()) + ", subprotocols: " + protocols); + if (this.webSocket != null) { + this.uninstallEventHandlers(); + } + this.webSocket = new ActionCable.WebSocket(this.consumer.url, protocols); + this.installEventHandlers(); + this.monitor.start(); + return true; + } + }; + + Connection.prototype.close = function(arg) { + var allowReconnect, ref1; + allowReconnect = (arg != null ? arg : { + allowReconnect: true + }).allowReconnect; + if (!allowReconnect) { + this.monitor.stop(); + } + if (this.isActive()) { + return (ref1 = this.webSocket) != null ? ref1.close() : void 0; + } + }; + + Connection.prototype.reopen = function() { + var error; + ActionCable.log("Reopening WebSocket, current state is " + (this.getState())); + if (this.isActive()) { + try { + return this.close(); + } catch (error1) { + error = error1; + return ActionCable.log("Failed to reopen WebSocket", error); + } finally { + ActionCable.log("Reopening WebSocket in " + this.constructor.reopenDelay + "ms"); + setTimeout(this.open, this.constructor.reopenDelay); + } + } else { + return this.open(); + } + }; + + Connection.prototype.getProtocol = function() { + var ref1; + return (ref1 = this.webSocket) != null ? ref1.protocol : void 0; + }; + + Connection.prototype.isOpen = function() { + return this.isState("open"); + }; + + Connection.prototype.isActive = function() { + return this.isState("open", "connecting"); + }; + + Connection.prototype.isProtocolSupported = function() { + var ref1; + return ref1 = this.getProtocol(), indexOf.call(supportedProtocols, ref1) >= 0; + }; + + Connection.prototype.isState = function() { + var ref1, states; + states = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return ref1 = this.getState(), indexOf.call(states, ref1) >= 0; + }; + + Connection.prototype.getState = function() { + var ref1, state, value; + for (state in WebSocket) { + value = WebSocket[state]; + if (value === ((ref1 = this.webSocket) != null ? ref1.readyState : void 0)) { + return state.toLowerCase(); + } + } + return null; + }; + + Connection.prototype.installEventHandlers = function() { + var eventName, handler; + for (eventName in this.events) { + handler = this.events[eventName].bind(this); + this.webSocket["on" + eventName] = handler; + } + }; + + Connection.prototype.uninstallEventHandlers = function() { + var eventName; + for (eventName in this.events) { + this.webSocket["on" + eventName] = function() {}; + } + }; + + Connection.prototype.events = { + message: function(event) { + var identifier, message, ref1, type; + if (!this.isProtocolSupported()) { + return; + } + ref1 = JSON.parse(event.data), identifier = ref1.identifier, message = ref1.message, type = ref1.type; + switch (type) { + case message_types.welcome: + this.monitor.recordConnect(); + return this.subscriptions.reload(); + case message_types.ping: + return this.monitor.recordPing(); + case message_types.confirmation: + return this.subscriptions.notify(identifier, "connected"); + case message_types.rejection: + return this.subscriptions.reject(identifier); + default: + return this.subscriptions.notify(identifier, "received", message); + } + }, + open: function() { + ActionCable.log("WebSocket onopen event, using '" + (this.getProtocol()) + "' subprotocol"); + this.disconnected = false; + if (!this.isProtocolSupported()) { + ActionCable.log("Protocol is unsupported. Stopping monitor and disconnecting."); + return this.close({ + allowReconnect: false + }); + } + }, + close: function(event) { + ActionCable.log("WebSocket onclose event"); + if (this.disconnected) { + return; + } + this.disconnected = true; + this.monitor.recordDisconnect(); + return this.subscriptions.notifyAll("disconnected", { + willAttemptReconnect: this.monitor.isRunning() + }); + }, + error: function() { + return ActionCable.log("WebSocket onerror event"); + } + }; + + return Connection; + + })(); + + }).call(this); + (function() { + var slice = [].slice; + + ActionCable.Subscriptions = (function() { + function Subscriptions(consumer) { + this.consumer = consumer; + this.subscriptions = []; + } + + Subscriptions.prototype.create = function(channelName, mixin) { + var channel, params, subscription; + channel = channelName; + params = typeof channel === "object" ? channel : { + channel: channel + }; + subscription = new ActionCable.Subscription(this.consumer, params, mixin); + return this.add(subscription); + }; + + Subscriptions.prototype.add = function(subscription) { + this.subscriptions.push(subscription); + this.consumer.ensureActiveConnection(); + this.notify(subscription, "initialized"); + this.sendCommand(subscription, "subscribe"); + return subscription; + }; + + Subscriptions.prototype.remove = function(subscription) { + this.forget(subscription); + if (!this.findAll(subscription.identifier).length) { + this.sendCommand(subscription, "unsubscribe"); + } + return subscription; + }; + + Subscriptions.prototype.reject = function(identifier) { + var i, len, ref, results, subscription; + ref = this.findAll(identifier); + results = []; + for (i = 0, len = ref.length; i < len; i++) { + subscription = ref[i]; + this.forget(subscription); + this.notify(subscription, "rejected"); + results.push(subscription); + } + return results; + }; + + Subscriptions.prototype.forget = function(subscription) { + var s; + this.subscriptions = (function() { + var i, len, ref, results; + ref = this.subscriptions; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + s = ref[i]; + if (s !== subscription) { + results.push(s); + } + } + return results; + }).call(this); + return subscription; + }; + + Subscriptions.prototype.findAll = function(identifier) { + var i, len, ref, results, s; + ref = this.subscriptions; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + s = ref[i]; + if (s.identifier === identifier) { + results.push(s); + } + } + return results; + }; + + Subscriptions.prototype.reload = function() { + var i, len, ref, results, subscription; + ref = this.subscriptions; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + subscription = ref[i]; + results.push(this.sendCommand(subscription, "subscribe")); + } + return results; + }; + + Subscriptions.prototype.notifyAll = function() { + var args, callbackName, i, len, ref, results, subscription; + callbackName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; + ref = this.subscriptions; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + subscription = ref[i]; + results.push(this.notify.apply(this, [subscription, callbackName].concat(slice.call(args)))); + } + return results; + }; + + Subscriptions.prototype.notify = function() { + var args, callbackName, i, len, results, subscription, subscriptions; + subscription = arguments[0], callbackName = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : []; + if (typeof subscription === "string") { + subscriptions = this.findAll(subscription); + } else { + subscriptions = [subscription]; + } + results = []; + for (i = 0, len = subscriptions.length; i < len; i++) { + subscription = subscriptions[i]; + results.push(typeof subscription[callbackName] === "function" ? subscription[callbackName].apply(subscription, args) : void 0); + } + return results; + }; + + Subscriptions.prototype.sendCommand = function(subscription, command) { + var identifier; + identifier = subscription.identifier; + return this.consumer.send({ + command: command, + identifier: identifier + }); + }; + + return Subscriptions; + + })(); + + }).call(this); + (function() { + ActionCable.Subscription = (function() { + var extend; + + function Subscription(consumer, params, mixin) { + this.consumer = consumer; + if (params == null) { + params = {}; + } + this.identifier = JSON.stringify(params); + extend(this, mixin); + } + + Subscription.prototype.perform = function(action, data) { + if (data == null) { + data = {}; + } + data.action = action; + return this.send(data); + }; + + Subscription.prototype.send = function(data) { + return this.consumer.send({ + command: "message", + identifier: this.identifier, + data: JSON.stringify(data) + }); + }; + + Subscription.prototype.unsubscribe = function() { + return this.consumer.subscriptions.remove(this); + }; + + extend = function(object, properties) { + var key, value; + if (properties != null) { + for (key in properties) { + value = properties[key]; + object[key] = value; + } + } + return object; + }; + + return Subscription; + + })(); + + }).call(this); + (function() { + ActionCable.Consumer = (function() { + function Consumer(url) { + this.url = url; + this.subscriptions = new ActionCable.Subscriptions(this); + this.connection = new ActionCable.Connection(this); + } + + Consumer.prototype.send = function(data) { + return this.connection.send(data); + }; + + Consumer.prototype.connect = function() { + return this.connection.open(); + }; + + Consumer.prototype.disconnect = function() { + return this.connection.close({ + allowReconnect: false + }); + }; + + Consumer.prototype.ensureActiveConnection = function() { + if (!this.connection.isActive()) { + return this.connection.open(); + } + }; + + return Consumer; + + })(); + + }).call(this); + }).call(this); + + if (typeof module === "object" && module.exports) { + module.exports = ActionCable; + } else if (typeof define === "function" && define.amd) { + define(ActionCable); + } +}).call(this); +// 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. +// + + + + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. +; +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. +; +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. +; +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. +; +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. +; +// 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. +// + + + + + + + +$(function(){ $(document).foundation(); }); diff --git a/public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js.gz b/public/assets/application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..5bf258d5d97423bcf843d83076c7670c63efe962 GIT binary patch literal 125936 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

        tXkjJh>~#fjis26jV;D=TWg#r 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 canvasWidth) { + this.xVelocity = -this.xVelocity; + this.x = canvasWidth; + } + // Check if has crossed the left edge + else if (this.x <= 0) { + this.xVelocity = -this.xVelocity; + this.x = 0; + } + + // Check if has crossed the bottom edge + if (this.y >= canvasHeight) { + this.yVelocity = -this.yVelocity; + this.y = canvasHeight; + } + + // Check if has crossed the top edge + else if (this.y <= 0) { + this.yVelocity = -this.yVelocity; + this.y = 0; + } + }; + + // A function to set the position of the particle. + this.setPosition = function(x, y) { + this.x = x; + this.y = y; + }; + + // Function to set the velocity. + this.setVelocity = function(x, y) { + this.xVelocity = x; + this.yVelocity = y; + }; + + this.setImage = function(image){ + this.image = image; + } +} + +// A function to generate a random number between 2 values +function generateRandom(min, max){ + return Math.random() * (max - min) + min; +} + +// The canvas context if it is defined. +var context; + +// Initialise the scene and set the context if possible +function init() { + var canvas = document.getElementById('myCanvas'); + if (canvas.getContext) { + + // Set the context variable so it can be re-used + context = canvas.getContext('2d'); + + // Create the particles and set their initial positions and velocities + for(var i=0; i < particleCount; ++i){ + var particle = new Particle(context); + + // Set the position to be inside the canvas bounds + particle.setPosition(generateRandom(0, canvasWidth), generateRandom(0, canvasHeight)); + + // Set the initial velocity to be either random and either negative or positive + particle.setVelocity(generateRandom(-maxVelocity, maxVelocity), generateRandom(-maxVelocity, maxVelocity)); + particles.push(particle); + } + } + else { + alert("Please use a modern browser"); + } +} + +// The function to draw the scene +function draw() { + // Clear the drawing surface and fill it with a black background + context.fillStyle = "rgba(0, 0, 0, 0.5)"; + context.fillRect(0, 0, 400, 400); + + // Go through all of the particles and draw them. + particles.forEach(function(particle) { + particle.draw(); + }); +} + +// Update the scene +function update() { + particles.forEach(function(particle) { + particle.update(); + }); +} + +// Initialize the scene +init(); + +// If the context is set then we can draw the scene (if not then the browser does not support canvas) +if (context) { + setInterval(function() { + // Update the scene befoe drawing + update(); + + // Draw the scene + draw(); + }, 1000 / targetFPS); +} +; diff --git a/public/assets/home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js.gz b/public/assets/home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..cfc2c1ccd7ed5bd05e24fe2817f917a045baaa9c GIT binary patch literal 1655 zcmV--28j6|iwFP=oaR{q1Fcw5Z`(Eye)q39@ z5vf^TQ8jxc(G#rU&%bVFv*i-rZ*gxe8m>WXA_-I@DKDrT?Yy;uYk0K^yKAy%byLG5 ztwhdr2aE$H`4$Q$X|9>zRt1Xv?j_c674~Z)OR8ZbNsV@QRDzb(dv#j`olzT}mREuls1R2< z22e+00#l=^yuTqOyropw&1i7baC>0M9R8UB{tUwDM#wjKsL3GWm%OO|@$XXv(S!GP z&>6P~;N`IIJK zcaegq&_;^J@23hSDOeNX=$}#cI+C@m#U5GjBeYwFwcaw!Fjp!jT0>p>Xa%)?w5G$^%_lLQ{p5;fm#LKR|;nXIx~m>#6qCb6ol(0rWKF>q_E&+H(- zaFM^by!yud-nC~wJ!oI<2@dk zkyJO52h&e+D1Mx%woL@f8+~XQ_BFFaio#~4G1Vvo(4K8A zv}F9A=xq{3Wh6ml-p6$BW4MS@aRI9ZT)|8D6_up-cMI5%O3_o=HkgwSx3|Q z^~FfziS#~+wxXK}Sc=ILBYur-@qfa(iqU-%yi90~Wpq56U5IASGLFLR4q$fA!0ceG z^0N_Zv3o9_-RXFKKG45WHG_z&ZeLlXWZJUlLdet#Oj_R5 z8S?gw>ekTFE2Pp@gA8-n<+r@E@=4A3!VClsLVsQLUA@4jlh z!^VhHO${V3t_p)-RMI_{9gPEVD3~1B<-kwvy31om)u0ZULt^Ka_38!~ydKYrH*kK= zCS)oeDBYBEz?>tzlfVphjhUF);fWPAp5!vLTd0#WiLdx%l9R{{;_GSwr`BBqeg@){ znLDTyuWqaoS2HG@?hU6U(d-e~t#s}^(v$doxli$5L<9CBp0*ENIW0P&t6}`xHEJ71 zzJq2w8`^(3YEn_Dle7DZ5@iPi>=(5_mWvrIMXRVhn~&SfN&0VVHPoVcKh&a0XEY%P zN^IDwYUGCGeR&%;XG+I1Cjwbz=1enemeOR(EUKU5l+pdB*PbxO((jP(Iw2hU?VowL z3w}0VB%qmcdvpZ1_`H{O`XwXxkQ#kZq7mDMG@_J~AogtZODFxotXDHN?7QvXvGKl% zx^}!7H(lkM4>w=+m_9c?en_x?n$gILSjN<65jJ3qq*+nTZYQL6bvmEfh8xUxtvSGWK{R?B!Qs2)L0069q BJW&7u literal 0 HcmV?d00001 diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 125dd4c91d..39eea5a660 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,7 +1,38 @@ require "test_helper" describe CategoriesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should successfully get to categorys index page" do + get categories_path + must_respond_with :success + end + + it "should successfully get to category show page" do + get category_path(categories(:brooms).id) + must_respond_with :success + end + + it "should successfully get new page" do + get new_category_path + must_respond_with :success + end + + it "should be able to create a new category" do + post categories_path, params: {category: {name: "creepy things"}} + must_respond_with :redirect + must_redirect_to categories_path + + proc { + post categories_path, params: {category: {name: "creepy things"}} + }.must_change 'Category.count', 1 + end + + it "should successfully delete category" do + delete category_path(categories(:brooms).id) + must_respond_with :redirect + must_redirect_to categories_path + + proc { + delete category_path(categories(:brooms).id) + }.must_change 'Category.count', -1 + end end From 72cce1f9fb6b740d00a5e399c9d6d3aa065324a8 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 08:35:25 -0700 Subject: [PATCH 036/210] Category views. --- Gemfile | 2 +- app/views/categories/index.html.erb | 10 ++++++++++ app/views/categories/new.html.erb | 6 ++++++ app/views/categories/show.html.erb | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/views/categories/new.html.erb create mode 100644 app/views/categories/show.html.erb diff --git a/Gemfile b/Gemfile index b8ff0a423b..da3d479f15 100644 --- a/Gemfile +++ b/Gemfile @@ -66,4 +66,4 @@ group :test do gem 'minitest-reporters' end -gem 'jquery-rails' +# gem 'jquery-rails' diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index e69de29bb2..89ae95f95a 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -0,0 +1,10 @@ +

        + + <% @categories.each do |category| %> +
        +
        + <%= category.name %> +
        +
        + <% end %> +
        diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb new file mode 100644 index 0000000000..623478ec82 --- /dev/null +++ b/app/views/categories/new.html.erb @@ -0,0 +1,6 @@ +<%= form_for @category do |f| %> + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.submit %> +<% end %> diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb new file mode 100644 index 0000000000..f66749fb4f --- /dev/null +++ b/app/views/categories/show.html.erb @@ -0,0 +1 @@ +category details here? From 912b0dd21dc240ea9102722d513c8c891dbf751c Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 09:41:25 -0700 Subject: [PATCH 037/210] Categories controller tests. --- app/controllers/categories_controller.rb | 7 ++++- app/models/category.rb | 2 +- .../controllers/categories_controller_test.rb | 29 ++++++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index a5eb3088ef..5f004997fe 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -13,7 +13,7 @@ def create if @category.save flash[:status] = :success flash[:result_text] = "Successfully created #{@category.name} category" - redirect_to category_path + redirect_to category_path(@category.id) else flash[:status] = :failure flash[:result_text] = "Could not create #{@category.name} category." @@ -24,6 +24,11 @@ def create def show @category = Category.find_by(id: params[:id]) + if @category == nil + flash[:status] = :failure + flash[:result_text] = "That category does not exist." + redirect_to categories_path, status: :not_found + end end def destroy diff --git a/app/models/category.rb b/app/models/category.rb index f751369d1a..f47c9aa0c8 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,5 +1,5 @@ class Category < ApplicationRecord - has_and_belongs_to_many :products + has_and_belongs_to_many :products, dependent: :destroy validates :name, presence: true, uniqueness: true, length: { maximum: 25 } end diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 39eea5a660..12888a1e1e 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe CategoriesController do + #TODO deal with delete test, more edge cases it "should successfully get to categorys index page" do get categories_path must_respond_with :success @@ -11,6 +12,12 @@ must_respond_with :success end + it "renders 404 not_found when you try to show an invalid category " do + bad = Category.last.id + 1 + get category_path(bad) + must_respond_with :not_found + end + it "should successfully get new page" do get new_category_path must_respond_with :success @@ -19,20 +26,20 @@ it "should be able to create a new category" do post categories_path, params: {category: {name: "creepy things"}} must_respond_with :redirect - must_redirect_to categories_path + must_redirect_to category_path(Category.last.id) proc { - post categories_path, params: {category: {name: "creepy things"}} + post categories_path, params: {category: {name: "other creepy things"}} }.must_change 'Category.count', 1 end - it "should successfully delete category" do - delete category_path(categories(:brooms).id) - must_respond_with :redirect - must_redirect_to categories_path - - proc { - delete category_path(categories(:brooms).id) - }.must_change 'Category.count', -1 - end + # it "should successfully delete category" do + # delete category_path(categories(:brooms).id) + # must_respond_with :redirect + # must_redirect_to categories_path + # + # proc { + # delete category_path(categories(:brooms).id) + # }.must_change 'Category.count', -1 + # end end From a64c4e3636267c58ee54254080365e9492636f98 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 09:42:25 -0700 Subject: [PATCH 038/210] Add relations tests to product and category --- app/controllers/orders_controller.rb | 1 + test/controllers/orders_controller_test.rb | 12 +++++++----- test/models/category_test.rb | 11 +++++++++++ test/models/order_test.rb | 5 +++++ test/models/product_test.rb | 9 +++++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 7949b5363a..1fa8269359 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -46,6 +46,7 @@ def edit def update @order = Order.find_by(id: params[:id]) + if !@order redirect_to root_path, status: :not_found elsif @order diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 7a7e3809fe..813e18e398 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,7 +1,9 @@ require "test_helper" +#TODO Look at update test that is commented out describe OrdersController do + CATEGORIES = %w(albums books movies) INVALID_CATEGORIES = ["nope", "42", "", " ", "albumstrailingtext"] @@ -144,11 +146,11 @@ must_respond_with :not_found end - it "does not allow changes to a complete order" do - order = orders(:complete_order) - get order_path(order.id) - must_redirect_to root_path - end + # it "does not allow changes to a complete order" do + # order = orders(:complete_order) + # get order_path(order.id) + # must_redirect_to root_path + # end end describe "destroy" do diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 241cb2440c..dc6e39f5a6 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -26,4 +26,15 @@ category = Category.new(name: "various colored sheets for ghosts") category.valid?.must_equal false end + + it "has a list of products in it" do + category = categories(:brooms) + product = products(:pointy_hat) + + category.must_respond_to :products + + category.products.count.must_equal 0 + category.products << product + category.products.count.must_equal 1 + end end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 6d3b5e4be6..3d5e447fb7 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -4,7 +4,12 @@ describe "relations" do it "has a list of products" do pending_order = orders(:pending_order) + product = products(:pointy_hat) + pending_order.must_respond_to :products + + pending_order.products << product + pending_order.products.count.must_equal 1 end end describe "validations" do diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a0c0b8d687..68a6d6f506 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -77,5 +77,14 @@ test.reviews[0].must_be_kind_of Review end + it "has a list of orders it is in" do + order = orders(:pending_order) + product = products(:pointy_hat) + + product.must_respond_to :orders + product.orders << order + product.orders.count.must_equal 1 + end + end end From 04bece041347d4968dba32238f3cd5a6e4ee22f3 Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 19 Oct 2017 09:42:41 -0700 Subject: [PATCH 039/210] SC added tests to reviews controller --- app/views/reviews/_form.html.erb | 0 app/views/reviews/create.html.erb | 0 app/views/reviews/destroy.html.erb | 0 app/views/reviews/edit.html.erb | 0 app/views/reviews/index.html.erb | 0 app/views/reviews/new.html.erb | 0 app/views/reviews/show.html.erb | 0 app/views/reviews/update.html.erb | 0 test/controllers/reviews_controller_test.rb | 74 +++++++++++++++++++-- test/fixtures/reviews.yml | 5 +- test/models/review_test.rb | 9 --- 11 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 app/views/reviews/_form.html.erb create mode 100644 app/views/reviews/create.html.erb create mode 100644 app/views/reviews/destroy.html.erb create mode 100644 app/views/reviews/edit.html.erb create mode 100644 app/views/reviews/index.html.erb create mode 100644 app/views/reviews/new.html.erb create mode 100644 app/views/reviews/show.html.erb create mode 100644 app/views/reviews/update.html.erb diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/create.html.erb b/app/views/reviews/create.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/destroy.html.erb b/app/views/reviews/destroy.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/show.html.erb b/app/views/reviews/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/update.html.erb b/app/views/reviews/update.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 386065239a..ba59517f40 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,7 +1,73 @@ require "test_helper" - +#test for create and destroy are commented out and not working +#might need edge cases +#test for 404 missing failing describe ReviewsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "index" do + it "succeeds with many reviews" do + Review.count.must_be :>, 0 + + get reviews_path + must_respond_with :success + end + it "succeeds with no reviews" do + Review.destroy_all + + get reviews_path + must_respond_with :success + end + end + describe "new" do + it "reviews" do + get new_review_path + must_respond_with :success + end + end +# describe "create" do +# it "should be able to create a review" do +# proc { +# post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } +# }.must_change 'Review.count', 1 +# +# must_respond_with :redirect +# must_redirect_to product_path +# end +# +# it "should rerender the form if it can't create the review" do +# proc { +# post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } +# }.must_change 'Review.count', 0 +# +# must_respond_with :success +# end +# +# end + describe "show" do + it "can show a review" do + get review_path( reviews(:reviewer).id ) + + must_respond_with :success + end + # it "should respond with 404 if it's not found" do + # + # reviews(:reviewer).destroy() + # + # get review_path( reviews(:reviewer).id ) + # + # must_respond_with :not_found + # end + end + describe "destroy" do + #need to either fix seed data or test differently + # it "can delete a review" do + # # test = Product.create(name: "Instant Fog", quantity_avail: 2, price: 3.99, merchant: Merchant.first) + # # review = Review.new(id: 999, rating: 5, text_review: "Smokin", product_id: test.id) + # # review_id = review.id + # delete reviews_path( reviews(:reviewer).id ) + # must_redirect_to root_path + # + # + # Review.find_by(id: review_id).must_be_nil + # end + end end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index dc3ee79b5d..b2bb9d0321 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -4,7 +4,10 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} +reviewer: + product_id: 1 + rating: 5 + text_review: "Such good smoke. Yes. <3" # column: value # two: {} diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 34d6da6696..1f6c703e13 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,11 +1,6 @@ require "test_helper" describe Review do -<<<<<<< HEAD - - -======= ->>>>>>> 7f940bf10f04fd58316cf6acea3f99a8a308cfc8 describe "validations" do it "requires a rating" do test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) @@ -34,8 +29,4 @@ review.valid?.must_equal false end end -<<<<<<< HEAD - -======= ->>>>>>> 7f940bf10f04fd58316cf6acea3f99a8a308cfc8 end From 19046da9d7271d3428381979cd4231c5514e9290 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 09:54:49 -0700 Subject: [PATCH 040/210] fixed table name for product categories, working in console --- Gemfile.lock | 5 ---- ...164759_rename_products_categories_table.rb | 5 ++++ db/schema.rb | 16 +++++----- test/controllers/merchants_controller_test.rb | 29 +++++++++++++++++-- test/controllers/products_controller_test.rb | 21 ++++++++++++-- test/fixtures/products.yml | 2 ++ 6 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 db/migrate/20171019164759_rename_products_categories_table.rb diff --git a/Gemfile.lock b/Gemfile.lock index e6d3f82865..59a4a196b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -82,10 +82,6 @@ GEM jbuilder (2.7.0) activesupport (>= 4.2.0) multi_json (>= 1.2) - jquery-rails (4.3.1) - rails-dom-testing (>= 1, < 3) - railties (>= 4.2.0) - thor (>= 0.14, < 2.0) jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks @@ -215,7 +211,6 @@ DEPENDENCIES capybara (~> 2.13) foundation-rails (= 6.4.1.2) jbuilder (~> 2.5) - jquery-rails jquery-turbolinks listen (>= 3.0.5, < 3.2) minitest-rails diff --git a/db/migrate/20171019164759_rename_products_categories_table.rb b/db/migrate/20171019164759_rename_products_categories_table.rb new file mode 100644 index 0000000000..ee3e2247c6 --- /dev/null +++ b/db/migrate/20171019164759_rename_products_categories_table.rb @@ -0,0 +1,5 @@ +class RenameProductsCategoriesTable < ActiveRecord::Migration[5.1] + def change + rename_table :products_categories, :categories_products + end +end diff --git a/db/schema.rb b/db/schema.rb index fb689f4ca8..05f1be2499 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171018195147) do +ActiveRecord::Schema.define(version: 20171019164759) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -21,6 +21,13 @@ t.datetime "updated_at", null: false end + create_table "categories_products", force: :cascade do |t| + t.bigint "product_id" + t.bigint "category_id" + t.index ["category_id"], name: "index_categories_products_on_category_id" + t.index ["product_id"], name: "index_categories_products_on_product_id" + end + create_table "merchants", force: :cascade do |t| t.string "username", null: false t.string "email", null: false @@ -58,13 +65,6 @@ t.index ["merchant_id"], name: "index_products_on_merchant_id" end - create_table "products_categories", force: :cascade do |t| - t.bigint "product_id" - t.bigint "category_id" - t.index ["category_id"], name: "index_products_categories_on_category_id" - t.index ["product_id"], name: "index_products_categories_on_product_id" - end - create_table "reviews", force: :cascade do |t| t.integer "rating" t.string "text_review" diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 6eb57f7baa..b1fd927990 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,7 +1,30 @@ require "test_helper" describe MerchantsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "#index" do + it "should respond with success when there are many merchants" do + Merchant.count.must_be :>, 0 + get merchants_path + must_respond_with :success + end + + it "should succeed with no users" do + Product.destroy_all + Merchant.destroy_all + + get merchants_path + must_respond_with :success + end + end + + describe "#new" do + it "merchants" do + get new_merchant_path + must_respond_with :success + end + end + + describe "#create" do + it "creates a merchant with " + end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 392a20e292..e0cadfb02b 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,22 @@ require "test_helper" describe ProductsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe 'root path' do + it "successfully navigates to root path" do + get root_path + must_respond_with :success + end + end + + describe 'index' do + it "succeeds when there are products" do + get products_path + must_respond_with :success + end + end + + describe 'create' do + + end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 8112686ab5..6821eefd4a 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -8,8 +8,10 @@ pointy_hat: name: "Pointy Hat" price: 9.99 quantity_avail: 5 + merchant: spooky missing_name: name: price: 9.99 quantity_avail: 5 + merchant: ghosty From c74765e65e6041ca63defd469bd72f49688470b9 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 10:11:27 -0700 Subject: [PATCH 041/210] Merge? --- test/fixtures/products.yml | 2 +- test/models/review_test.rb | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 8112686ab5..0661f50fd8 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,4 +1,4 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +s# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 34d6da6696..539f174a12 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,11 +1,7 @@ require "test_helper" describe Review do -<<<<<<< HEAD - -======= ->>>>>>> 7f940bf10f04fd58316cf6acea3f99a8a308cfc8 describe "validations" do it "requires a rating" do test = Product.create(name: "Caldroun", quantity_avail: 5, price: 68.50, merchant: Merchant.first) @@ -34,8 +30,4 @@ review.valid?.must_equal false end end -<<<<<<< HEAD - -======= ->>>>>>> 7f940bf10f04fd58316cf6acea3f99a8a308cfc8 end From f10c59f63653c75539d45d24d445f47f17af0fc2 Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 19 Oct 2017 10:13:46 -0700 Subject: [PATCH 042/210] fixing destroy test on reviews controller --- app/controllers/reviews_controller.rb | 2 +- test/controllers/reviews_controller_test.rb | 72 ++++++++++----------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index abfda15275..da0c1445c6 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -8,7 +8,7 @@ def new end def create - @review = Review.new(product_id: params[:review][:product_id], text_review: params[:review][:text_review], rating: [:review][:rating]) + @review = Review.new(params[:review][:product_id], text_review: params[:review][:text_review], rating: [:review][:rating]) if @review.save flash[:status] = :success flash[:result_text] = "Successfully reviewed!" diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index ba59517f40..43e61226e0 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -23,51 +23,49 @@ must_respond_with :success end end -# describe "create" do -# it "should be able to create a review" do -# proc { -# post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } -# }.must_change 'Review.count', 1 -# -# must_respond_with :redirect -# must_redirect_to product_path -# end -# -# it "should rerender the form if it can't create the review" do -# proc { -# post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } -# }.must_change 'Review.count', 0 -# -# must_respond_with :success -# end -# -# end + describe "create" do + it "should be able to create a review" do + proc { + post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } + }.must_change 'Review.count', 1 + + must_respond_with :redirect + must_redirect_to product_path +end + + it "should rerender the form if it can't create the review" do + proc { + post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } + }.must_change 'Review.count', 0 + + must_respond_with :success + end + + end describe "show" do it "can show a review" do get review_path( reviews(:reviewer).id ) must_respond_with :success end - # it "should respond with 404 if it's not found" do - # - # reviews(:reviewer).destroy() - # - # get review_path( reviews(:reviewer).id ) - # - # must_respond_with :not_found - # end + it "should respond with 404 if it's not found" do + review = Review.last.id +1 + + get review_path(review) + + must_respond_with :not_found + end end describe "destroy" do #need to either fix seed data or test differently - # it "can delete a review" do - # # test = Product.create(name: "Instant Fog", quantity_avail: 2, price: 3.99, merchant: Merchant.first) - # # review = Review.new(id: 999, rating: 5, text_review: "Smokin", product_id: test.id) - # # review_id = review.id - # delete reviews_path( reviews(:reviewer).id ) - # must_redirect_to root_path - # - # - # Review.find_by(id: review_id).must_be_nil - # end + it "can delete a review" do + + review = reviews(:reviewer) + delete review_path( review.id ) + must_redirect_to products_path + + + Review.find_by(id: review.id).must_be_nil + end end end From 0ceba864848cc2f8c8c7072702bb50399d34a4ae Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 10:30:41 -0700 Subject: [PATCH 043/210] Remove typo --- test/fixtures/products.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 15f9c3fad6..6821eefd4a 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,4 +1,4 @@ -s# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately From 6ac1b70f3ba6502125f95b9bf70f9fd52f15faef Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 19 Oct 2017 13:48:46 -0700 Subject: [PATCH 044/210] all tests passing for reviews controller --- app/controllers/reviews_controller.rb | 5 ++++- test/controllers/reviews_controller_test.rb | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index da0c1445c6..e31b4692cd 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -8,7 +8,7 @@ def new end def create - @review = Review.new(params[:review][:product_id], text_review: params[:review][:text_review], rating: [:review][:rating]) + @review = Review.new(product_id: params[:review][:product_id], text_review: params[:review][:text_review],rating: params[:review][:rating]) if @review.save flash[:status] = :success flash[:result_text] = "Successfully reviewed!" @@ -23,6 +23,9 @@ def create def show @review = Review.find_by(id: params[:id]) + unless @review + redirect_to root_path, status: :not_found + end end def destroy diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 43e61226e0..6e6405150e 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -30,15 +30,15 @@ }.must_change 'Review.count', 1 must_respond_with :redirect - must_redirect_to product_path + must_redirect_to product_path(Review.last.product_id) end it "should rerender the form if it can't create the review" do proc { - post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } + post reviews_path, params: { review: {rating: -1, text_review: "Smokin.", product_id: products(:pointy_hat).id} } }.must_change 'Review.count', 0 - must_respond_with :success + must_respond_with :bad_request end end @@ -49,7 +49,7 @@ must_respond_with :success end it "should respond with 404 if it's not found" do - review = Review.last.id +1 + review = Review.last.id + 1 get review_path(review) From 5cabd8dfe769d2583e186c195bcee5842eb98149 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 13:51:33 -0700 Subject: [PATCH 045/210] Remove destroy action from orders controller: orders should never be created --- app/controllers/orders_controller.rb | 16 ++----------- test/controllers/orders_controller_test.rb | 28 +++------------------- 2 files changed, 5 insertions(+), 39 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 1fa8269359..64d791a934 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,6 @@ class OrdersController < ApplicationController #TODO: clean up with controller filters -#TODO: discuss rules around destroy action. what happens to products/inventory when an order is destroyed? +#TODO: discuss rules around destroy action. def index @orders = Order.all end @@ -46,7 +46,7 @@ def edit def update @order = Order.find_by(id: params[:id]) - + if !@order redirect_to root_path, status: :not_found elsif @order @@ -67,18 +67,6 @@ def update end end - def destroy - @order = Order.find_by(id: params[:id]) - if !@order - redirect_to root_path, status: :not_found - else - @order.destroy - flash[:status] = :success - flash[:result_text] = "Successfully destroyed order number #{@order.id}" - redirect_to root_path - end - end - private def order_params return params.require(:order).permit(:email, :address, :name, :card_number, :card_exp, :card_cvv, :zip_code) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 813e18e398..ab5968bdf0 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -146,32 +146,10 @@ must_respond_with :not_found end - # it "does not allow changes to a complete order" do - # order = orders(:complete_order) - # get order_path(order.id) - # must_redirect_to root_path - # end - end - - describe "destroy" do - it "succeeds for an existing order" do - order = Order.first.id - - delete order_path(order) + it "does not allow changes to a complete order" do + order = orders(:complete_order) + patch order_path(order.id) must_redirect_to root_path - - # The work should really be gone - Order.find_by(id: order).must_be_nil - end - - it "renders 404 not_found and does not update the DB for a bogus order ID" do - start_count = Order.count - - bogus_order_id = Order.last.id + 1 - delete order_path(bogus_order_id) - must_respond_with :not_found - - Order.count.must_equal start_count end end From 50b68c56909f073fcba8be4eee75b22048f06c7c Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 14:00:21 -0700 Subject: [PATCH 046/210] merchants controller testing complete for index and show --- test/controllers/merchants_controller_test.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index b1fd927990..6fa9186c63 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -8,7 +8,7 @@ must_respond_with :success end - it "should succeed with no users" do + it "should succeed with no merchants" do Product.destroy_all Merchant.destroy_all @@ -17,14 +17,10 @@ end end - describe "#new" do - it "merchants" do - get new_merchant_path + describe "#show" do + it "should succeed with an existing merchant" do + get merchant_path(Merchant.first) must_respond_with :success end end - - describe "#create" do - it "creates a merchant with " - end end From 6a91287ed61cf75e945add57c2f5b98878ad0c70 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 14:53:22 -0700 Subject: [PATCH 047/210] tested remove one from stock model method - passing --- app/assets/javascripts/sessions.js | 2 ++ app/assets/stylesheets/sessions.scss | 3 +++ app/controllers/sessions_controller.rb | 4 ++++ app/helpers/sessions_helper.rb | 2 ++ app/models/product.rb | 11 +++++++++++ test/controllers/sessions_controller_test.rb | 7 +++++++ test/models/product_test.rb | 10 ++++++++++ 7 files changed, 39 insertions(+) create mode 100644 app/assets/javascripts/sessions.js create mode 100644 app/assets/stylesheets/sessions.scss create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/helpers/sessions_helper.rb create mode 100644 test/controllers/sessions_controller_test.rb diff --git a/app/assets/javascripts/sessions.js b/app/assets/javascripts/sessions.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/sessions.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..7bef9cf826 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sessions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..22ca8debf6 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,4 @@ +class SessionsController < ApplicationController + def create + end +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 0000000000..309f8b2eb3 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/app/models/product.rb b/app/models/product.rb index 2787b1eb9e..0900e2087e 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -8,4 +8,15 @@ class Product < ApplicationRecord has_and_belongs_to_many :categories has_and_belongs_to_many :orders + def remove_one_from_stock + if self.quantity_avail > 0 + # order = Order.find_by(id: session[:order_id]) + # order.products << self + self.quantity_avail -= 1 + self.save + else + flash[:error] = "product is not available" + end + end + end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb new file mode 100644 index 0000000000..c2632a720b --- /dev/null +++ b/test/controllers/sessions_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe SessionsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 68a6d6f506..b1060712a8 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -87,4 +87,14 @@ end end + + describe "#remove_one_from_stock" do + it "should add an available product to the cart" do + product = products(:pointy_hat) + + proc { + product.remove_one_from_stock + }.must_change "product.quantity_avail", - 1 + end + end end From 771114ab54b01c942879d6800c9f4d44af5d2c66 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 15:00:34 -0700 Subject: [PATCH 048/210] method method for in stock product works correctly --- app/models/product.rb | 4 ---- test/fixtures/products.yml | 6 ++++++ test/models/product_test.rb | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 0900e2087e..7c4c03e38b 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -10,12 +10,8 @@ class Product < ApplicationRecord def remove_one_from_stock if self.quantity_avail > 0 - # order = Order.find_by(id: session[:order_id]) - # order.products << self self.quantity_avail -= 1 self.save - else - flash[:error] = "product is not available" end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 6821eefd4a..d88a02d737 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -15,3 +15,9 @@ missing_name: price: 9.99 quantity_avail: 5 merchant: ghosty + +out_of_stock: + name: "Nopes" + price: 4.99 + quantity_avail: 0 + merchant: ghosty diff --git a/test/models/product_test.rb b/test/models/product_test.rb index b1060712a8..f98b64336a 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -96,5 +96,13 @@ product.remove_one_from_stock }.must_change "product.quantity_avail", - 1 end + + it "should not change product quantity if product isn't available" do + product = products(:out_of_stock) + + proc { + product.remove_one_from_stock + }.wont_change "product.quantity_avail" + end end end From d17ad1909572c85ea02da89e20d5c35370935f62 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 15:18:12 -0700 Subject: [PATCH 049/210] Passing tests for categories controller with edge cases. --- Gemfile | 2 +- Gemfile.lock | 5 +++ app/assets/javascripts/application.js | 2 + app/assets/javascripts/home.js | 8 +++- app/controllers/categories_controller.rb | 4 +- app/controllers/products_controller.rb | 8 +++- app/views/layouts/application.html.erb | 3 -- .../controllers/categories_controller_test.rb | 37 +++++++++++++------ test/fixtures/products.yml | 2 +- 9 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Gemfile b/Gemfile index da3d479f15..b8ff0a423b 100644 --- a/Gemfile +++ b/Gemfile @@ -66,4 +66,4 @@ group :test do gem 'minitest-reporters' end -# gem 'jquery-rails' +gem 'jquery-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 59a4a196b9..e6d3f82865 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -82,6 +82,10 @@ GEM jbuilder (2.7.0) activesupport (>= 4.2.0) multi_json (>= 1.2) + jquery-rails (4.3.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks @@ -211,6 +215,7 @@ DEPENDENCIES capybara (~> 2.13) foundation-rails (= 6.4.1.2) jbuilder (~> 2.5) + jquery-rails jquery-turbolinks listen (>= 3.0.5, < 3.2) minitest-rails diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 17065a8367..dfeb472269 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,6 +10,8 @@ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // + +//= require jquery //= require home.js //= require rails-ujs //= require foundation diff --git a/app/assets/javascripts/home.js b/app/assets/javascripts/home.js index a770edcbdb..0e7d4e5f80 100644 --- a/app/assets/javascripts/home.js +++ b/app/assets/javascripts/home.js @@ -121,7 +121,9 @@ var context; // Initialise the scene and set the context if possible function init() { + console.log("in init") var canvas = document.getElementById('myCanvas'); + console.log("canvas: " + canvas) if (canvas.getContext) { // Set the context variable so it can be re-used @@ -164,7 +166,11 @@ function update() { } // Initialize the scene -init(); + +document.addEventListener("DOMContentLoaded", function(event){ + console.log("gets to init") + init(); +}); // If the context is set then we can draw the scene (if not then the browser does not support canvas) if (context) { diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 5f004997fe..fa1dabcff1 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -33,7 +33,9 @@ def show def destroy @category = Category.find_by(id: params[:id]) - if @category.destroy + if !@category + redirect_to root_path, status: :not_found + elsif @category.destroy flash[:status] = :success flash[:result_text] = "Category deleted" redirect_to categories_path diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 97969f6efd..c69d086a11 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -27,13 +27,17 @@ def show def destroy @product = Product.find_by(id: params[:id]) - if @product.destroy + if !@product + redirect_to root_path, status: :not_found + elsif @product.destroy flash[:status] = :success flash[:result_text] = "Product deleted" - redirect_to categories_path + redirect_to products_path else flash[:status] = :failure flash[:result_text] = "That product is unable to be deleted." + redirect_to products_path, status: :not_found + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5049f8c568..fb60fd0462 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,9 +10,6 @@ <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> - - <%= yield :head %> diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 12888a1e1e..6237ed299e 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,8 +1,13 @@ require "test_helper" describe CategoriesController do - #TODO deal with delete test, more edge cases - it "should successfully get to categorys index page" do + it "should successfully get to categories index page" do + get categories_path + must_respond_with :success + end + + it "succeeds when there are no categories" do + Category.destroy_all get categories_path must_respond_with :success end @@ -33,13 +38,23 @@ }.must_change 'Category.count', 1 end - # it "should successfully delete category" do - # delete category_path(categories(:brooms).id) - # must_respond_with :redirect - # must_redirect_to categories_path - # - # proc { - # delete category_path(categories(:brooms).id) - # }.must_change 'Category.count', -1 - # end + it "should successfully delete category" do + delete category_path(categories(:brooms).id) + must_respond_with :redirect + must_redirect_to categories_path + + proc { + delete category_path(categories(:cauldrons).id) + }.must_change 'Category.count', -1 + end + + it "renders 404 not_found and does not update the DB for a bogus category ID" do + start_count = Category.count + + bad = Category.last.id + 1 + delete category_path(bad) + must_respond_with :not_found + + Category.count.must_equal start_count + end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 15f9c3fad6..6821eefd4a 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,4 +1,4 @@ -s# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately From fcf9ad55a2cfb6ec2ff8b3e08d83a9d94880f077 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 15:42:32 -0700 Subject: [PATCH 050/210] All products controller tests except the create. --- app/controllers/products_controller.rb | 3 + app/views/products/new.html.erb | 15 +++++ test/controllers/products_controller_test.rb | 66 +++++++++++++++++++- 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 app/views/products/new.html.erb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c69d086a11..ed738f01e9 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -23,6 +23,9 @@ def create def show @product = Product.find_by(id: params[:id]) + unless @product + redirect_to root_path, status: :not_found + end end def destroy diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..eec7cd609d --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,15 @@ +<%= form_for @product do |f| %> + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.label :price %> + <%= f.text_field :price %> + + <%= f.label :quantity_avail %> + <%= f.text_field :quantity_avail %> + + <%= f.label :merchant %> + <%= f.text_field :merchant %> + + <%= f.submit %> +<% end %> diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index e0cadfb02b..2679c98a8a 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -14,9 +14,73 @@ get products_path must_respond_with :success end + + it "succeeds when there are no products" do + Product.destroy_all + get products_path + must_respond_with :success + end + end + + describe "new" do + it "works" do + get new_product_path + must_respond_with :success + end + end + + describe "create" do + it "creates a new product" do + # post products_path, params: {product: {name: "creepy things", quantity_avail: 4, price: 9.99, merchant_id: merchants(:spooky)}} + # must_respond_with :redirect + # must_redirect_to product_path(Product.last.id) + + # proc { + # post products_path, params: {product: {name: "creepy things", quantity_avail: 4, price: 9.99, merchant: merchants(:witch)}} + # }.must_change 'Category.count', 1 + end + end + + describe "show" do + it "succeeds for an existing product" do + get product_path(Product.first) + must_respond_with :success + end + + it "renders 404 not_found for a bogus product ID" do + fake = Product.last.id + 1 + get product_path(fake) + must_respond_with :not_found + end + end + # + describe "edit" do + #This wasn't in the controller actions. Do we want an edit method? end - describe 'create' do + describe "update" do + #This wasn't in the controller actions. Do we want an edit method? + end + describe "delete" do + it "should successfully delete product" do + delete product_path(products(:pointy_hat).id) + must_respond_with :redirect + must_redirect_to products_path + + proc { + delete product_path(products(:out_of_stock).id) + }.must_change 'Product.count', -1 + end + + it "renders 404 not_found and does not update the DB for a bogus product ID" do + start_count = Product.count + + bad = Product.last.id + 1 + delete product_path(bad) + must_respond_with :not_found + + Product.count.must_equal start_count + end end end From 779ddc081ad17c8765218bdfe9f5c3eb645ab340 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 15:51:48 -0700 Subject: [PATCH 051/210] Order billing details form. --- app/views/orders/index.html.erb | 15 +++++++++++++++ app/views/orders/new.html.erb | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index e69de29bb2..563b36f755 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -0,0 +1,15 @@ +<%= form_for @order do |f| %> + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.label :price %> + <%= f.text_field :price %> + + <%= f.label :quantity_avail %> + <%= f.text_field :quantity_avail %> + + <%= f.label :merchant %> + <%= f.text_field :merchant %> + + <%= f.submit %> +<% end %> diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb index e69de29bb2..2f71d11ded 100644 --- a/app/views/orders/new.html.erb +++ b/app/views/orders/new.html.erb @@ -0,0 +1,24 @@ +<%= form_for @order do |f| %> + <%= f.label :email %> + <%= f.text_field :email %> + + <%= f.label :address %> + <%= f.text_field :address %> + + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.label :card_number %> + <%= f.text_field :card_number %> + + <%= f.label :card_exp %> + <%= f.text_field :card_exp %> + + <%= f.label :card_cvv %> + <%= f.text_field :card_cvv %> + + <%= f.label :zip_code %> + <%= f.text_field :zip_code %> + + <%= f.submit %> +<% end %> From 9b337badf63014b8f74c24fc00827ce73e5d40d6 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 16:04:44 -0700 Subject: [PATCH 052/210] Updated routes for merchant_products path. --- app/assets/stylesheets/application.css | 4 ++-- app/controllers/products_controller.rb | 7 ++++++- app/views/merchants/index.html.erb | 13 ++++++++++++- config/routes.rb | 4 +++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index aed07e97fa..7f46801d36 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -47,7 +47,7 @@ body { width: 100%; } -.all-products { +.all-products, .all-merchants, .all-categories { display: flex; flex-flow: row; flex-wrap: wrap; @@ -60,7 +60,7 @@ body { overflow: hidden; } -.product { +.product, .merchant, .category { display: flex; flex-flow: column; padding: 1em; diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ed738f01e9..2d16f85096 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,11 @@ class ProductsController < ApplicationController def index - @products = Product.all + if params[:merchant_id] + merchant = Merchant.find_by(id: params[:merchant_id]) + @products = merchant.products + else + @products = Product.all + end end def new diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 4ac2964df7..16a06a7b65 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -1 +1,12 @@ -

        Merchants#index

        +
        + + <% @merchants.each do |merchant| %> +
        +
        + <%= merchant.name %> + <%= merchant.email %> + <%= link_to "Check out their Products", merchant_products_path(merchant.id), alt: "Link to merchant's products"%> +
        +
        + <% end %> +
        diff --git a/config/routes.rb b/config/routes.rb index 2a04d7bf03..b787b544b4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,9 @@ resources :categories - resources :merchants + resources :merchants do + get '/products', to: 'products#index' + end resources :orders resources :products resources :reviews From ec1d06d7fe22d171770119a709e3d7e5d97f8454 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 16:09:10 -0700 Subject: [PATCH 053/210] Working browse by merchants products path --- app/assets/stylesheets/application.css | 2 +- app/views/layouts/application.html.erb | 1 + app/views/merchants/index.html.erb | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7f46801d36..cf25395bac 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -34,7 +34,7 @@ body { } .nav-links { - font-size: 2rem; + font-size: 1.5rem; float: right; } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index fb60fd0462..858179cba1 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -22,6 +22,7 @@ <%= link_to "Browse Products", products_path %> + <%= link_to "Browse Merchants", merchants_path %> <%= link_to "Browse Categories", categories_path %> <%= link_to "Home", root_path %> diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 16a06a7b65..0d2fa32420 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -3,7 +3,7 @@ <% @merchants.each do |merchant| %>
        - <%= merchant.name %> + <%= merchant.username %> <%= merchant.email %> <%= link_to "Check out their Products", merchant_products_path(merchant.id), alt: "Link to merchant's products"%>
        From c3d7b67be1d1f839cb69036a94b4003d3df50af1 Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Thu, 19 Oct 2017 16:14:26 -0700 Subject: [PATCH 054/210] Slightly updated root path. --- app/views/products/{root.html.erb => home.html.erb} | 0 config/routes.rb | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename app/views/products/{root.html.erb => home.html.erb} (100%) diff --git a/app/views/products/root.html.erb b/app/views/products/home.html.erb similarity index 100% rename from app/views/products/root.html.erb rename to app/views/products/home.html.erb diff --git a/config/routes.rb b/config/routes.rb index b787b544b4..fc37627f63 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - root 'products#root' + root to: 'products#home', as: "root" resources :categories From 8ea29750408dc813a0e94ff8a03923f010babd11 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 16:14:40 -0700 Subject: [PATCH 055/210] Test user can add product to pending order --- Gemfile | 1 + Gemfile.lock | 2 ++ app/controllers/products_controller.rb | 14 ++++++++++++++ config/routes.rb | 2 ++ test/controllers/products_controller_test.rb | 10 +++++++++- test/fixtures/products.yml | 3 +++ test/test_helper.rb | 4 ++++ 7 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index da3d479f15..6db947828a 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ git_source(:github) do |repo_name| "https://github.com/#{repo_name}.git" end +gem 'awesome_print' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.1.4' diff --git a/Gemfile.lock b/Gemfile.lock index 59a4a196b9..016a83316d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,6 +42,7 @@ GEM public_suffix (>= 2.0.2, < 4.0) ansi (1.5.0) arel (8.0.0) + awesome_print (1.8.0) babel-source (5.8.35) babel-transpiler (0.7.0) babel-source (>= 4.0, < 6) @@ -205,6 +206,7 @@ PLATFORMS ruby DEPENDENCIES + awesome_print better_errors binding_of_caller byebug diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 97969f6efd..dbe57a857d 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -37,4 +37,18 @@ def destroy end end + def add_product_to_cart + @product = Product.find_by(id: params[:id]) + if @product.remove_one_from_stock + ap session[:order_id] + order = Order.find_by(id: session[:order_id]) + order.products << @product + flash[:success] = "product added to cart" + redirect_to root_path + else + flash[:error] = "product not available" + status :bad_request + end + end + end diff --git a/config/routes.rb b/config/routes.rb index 2a04d7bf03..e6af78be23 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,4 +9,6 @@ resources :products resources :reviews + patch 'products/:id/add_product_to_cart', to: 'products#add_product_to_cart', as: 'add_product' + end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index e0cadfb02b..7dd9af9b58 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -16,7 +16,15 @@ end end - describe 'create' do + describe "#add_product_to_cart" do + setup { session_setup } + it "should add the product to the pending" do + # Order.create + # controller.session[:order_id] = order.id + patch add_product_path(products(:pointy_hat).id) + must_respond_with :redirect + end end + end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index d88a02d737..81c10f65ed 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -9,6 +9,7 @@ pointy_hat: price: 9.99 quantity_avail: 5 merchant: spooky + missing_name: name: @@ -16,6 +17,8 @@ missing_name: quantity_avail: 5 merchant: ghosty + + out_of_stock: name: "Nopes" price: 4.99 diff --git a/test/test_helper.rb b/test/test_helper.rb index ecb3b34e99..e4f1d53de4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -22,5 +22,9 @@ class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all + + def session_setup + post orders_path, params: { sig: orders } + end # Add more helper methods to be used by all tests here... end From 7ff8c1bf6794bf021afcf30848a82602fa6d581d Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 16:19:17 -0700 Subject: [PATCH 056/210] Saved file --- test/controllers/products_controller_test.rb | 42 ++++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index dd91072ab2..f29503844d 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -68,31 +68,31 @@ must_respond_with :redirect end - # describe "update" do - # #This wasn't in the controller actions. Do we want an edit method? - # end - - describe "delete" do - it "should successfully delete product" do - delete product_path(products(:pointy_hat).id) - must_respond_with :redirect - must_redirect_to products_path - - proc { - delete product_path(products(:out_of_stock).id) - }.must_change 'Product.count', -1 - end + # describe "update" do + # #This wasn't in the controller actions. Do we want an edit method? + # end + + describe "delete" do + it "should successfully delete product" do + delete product_path(products(:pointy_hat).id) + must_respond_with :redirect + must_redirect_to products_path + + proc { + delete product_path(products(:out_of_stock).id) + }.must_change 'Product.count', -1 + end - it "renders 404 not_found and does not update the DB for a bogus product ID" do - start_count = Product.count + it "renders 404 not_found and does not update the DB for a bogus product ID" do + start_count = Product.count - bad = Product.last.id + 1 - delete product_path(bad) - must_respond_with :not_found + bad = Product.last.id + 1 + delete product_path(bad) + must_respond_with :not_found - Product.count.must_equal start_count + Product.count.must_equal start_count - end end end end +end From 0d82686c8170fcdb5143f36f156bb4c9cb224a41 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 16:30:51 -0700 Subject: [PATCH 057/210] Test negative case for add_products action --- app/controllers/products_controller.rb | 2 +- test/controllers/products_controller_test.rb | 46 ++++++++++---------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a1ac0ff772..7d60248bf4 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -59,7 +59,7 @@ def add_product_to_cart redirect_to root_path else flash[:error] = "product not available" - status :bad_request + redirect_to products_path, status: :bad_request end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index f29503844d..7dea0ecacf 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -60,39 +60,41 @@ describe "#add_product_to_cart" do setup { session_setup } - it "should add the product to the pending" do - # Order.create - # controller.session[:order_id] = order.id + it "should add in-stock products to the pending order" do patch add_product_path(products(:pointy_hat).id) must_respond_with :redirect end - # describe "update" do - # #This wasn't in the controller actions. Do we want an edit method? - # end + it "should not add out-of-stock products to pending order" do + patch add_product_path(products(:out_of_stock).id) + must_respond_with :bad_request + end + end + # describe "update" do + # #This wasn't in the controller actions. Do we want an edit method? + # end - describe "delete" do - it "should successfully delete product" do - delete product_path(products(:pointy_hat).id) - must_respond_with :redirect - must_redirect_to products_path + describe "delete" do + it "should successfully delete product" do + delete product_path(products(:pointy_hat).id) + must_respond_with :redirect + must_redirect_to products_path - proc { - delete product_path(products(:out_of_stock).id) - }.must_change 'Product.count', -1 - end + proc { + delete product_path(products(:out_of_stock).id) + }.must_change 'Product.count', -1 + end - it "renders 404 not_found and does not update the DB for a bogus product ID" do - start_count = Product.count + it "renders 404 not_found and does not update the DB for a bogus product ID" do + start_count = Product.count - bad = Product.last.id + 1 - delete product_path(bad) - must_respond_with :not_found + bad = Product.last.id + 1 + delete product_path(bad) + must_respond_with :not_found - Product.count.must_equal start_count + Product.count.must_equal start_count - end end end end From d06777c8a6db9d082692efab6ab791b356668776 Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 16:53:27 -0700 Subject: [PATCH 058/210] pushing current version to gihub --- test/controllers/products_controller_test.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 7dea0ecacf..778924bd5e 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -64,11 +64,13 @@ it "should add in-stock products to the pending order" do patch add_product_path(products(:pointy_hat).id) must_respond_with :redirect + flash.keys.must_include "success" end it "should not add out-of-stock products to pending order" do patch add_product_path(products(:out_of_stock).id) must_respond_with :bad_request + flash.keys.must_include "error" end end # describe "update" do From a46dc9ced11cebf7bc5f1add6287dbc98d3efdce Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 19 Oct 2017 17:35:09 -0700 Subject: [PATCH 059/210] added tests for product adding quantity to product in cart --- app/controllers/products_controller.rb | 4 ++++ app/models/product.rb | 3 +++ test/controllers/products_controller_test.rb | 14 ++++++++++++++ test/models/product_test.rb | 9 +++++++++ 4 files changed, 30 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7d60248bf4..30872eebc8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -63,4 +63,8 @@ def add_product_to_cart end end + # def increment_in_cart + # @product = Product.find_by(id: params[:id]) + # + # end end diff --git a/app/models/product.rb b/app/models/product.rb index 7c4c03e38b..84803a7a02 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -12,6 +12,9 @@ def remove_one_from_stock if self.quantity_avail > 0 self.quantity_avail -= 1 self.save + return true + else + return false end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 778924bd5e..615e9fc94d 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -72,6 +72,20 @@ must_respond_with :bad_request flash.keys.must_include "error" end + + it "can add the same product multiple times when in stock" do + patch add_product_path(products(:pointy_hat).id) + patch add_product_path(products(:pointy_hat).id) + + order = Order.find_by(id: session[:order_id]) + order.products.size.must_equal 2 + + order.products.each do |prod| + prod.name.must_equal "Pointy Hat" + end + product = products(:pointy_hat) + product.quantity_avail.must_equal 3 + end end # describe "update" do # #This wasn't in the controller actions. Do we want an edit method? diff --git a/test/models/product_test.rb b/test/models/product_test.rb index f98b64336a..963827f71f 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -97,6 +97,11 @@ }.must_change "product.quantity_avail", - 1 end + it "returns true if successful" do + product = products(:pointy_hat) + product.remove_one_from_stock.must_equal true + end + it "should not change product quantity if product isn't available" do product = products(:out_of_stock) @@ -104,5 +109,9 @@ product.remove_one_from_stock }.wont_change "product.quantity_avail" end + it "returns false if unsuccessful" do + product = products(:out_of_stock) + product.remove_one_from_stock.must_equal false + end end end From 305db40d34534b8df10977196ff9598a434501f8 Mon Sep 17 00:00:00 2001 From: Sara C Date: Thu, 19 Oct 2017 20:39:07 -0700 Subject: [PATCH 060/210] made nested routes for product reviews, added validation for product id in review model, made form for review --- app/models/review.rb | 2 ++ app/views/reviews/_form.html.erb | 11 +++++++++++ app/views/reviews/new.html.erb | 1 + config/routes.rb | 11 +++++++---- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index a9924876b5..c14b9e4d62 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,3 +1,5 @@ class Review < ApplicationRecord + belongs_to :products validates :rating, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 5} + validates :product_id, presence: true end diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb index e69de29bb2..98f34ccabe 100644 --- a/app/views/reviews/_form.html.erb +++ b/app/views/reviews/_form.html.erb @@ -0,0 +1,11 @@ +
        + <%= form_for @review do |f| %> + <%= f.label :rating %> + <%= f.select :rating, options_for_select((1..5)) %> + + <%= f.label :Review %> + <%= f.text_field :text_review %> + + <%= f.submit class: "button" %> + <% end %> +
        diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index e69de29bb2..d44c608b6a 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -0,0 +1 @@ +<%= render partial: "form" %> diff --git a/config/routes.rb b/config/routes.rb index ca9400255d..fecc91b09f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,14 +2,17 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root to: 'products#home', as: "root" - resources :categories + resources :orders + + resources :products do + resources :reviews + end + resources :merchants do get '/products', to: 'products#index' end - resources :orders - resources :products - resources :reviews + patch 'products/:id/add_product_to_cart', to: 'products#add_product_to_cart', as: 'add_product' From a8d92e4a5c3731e212d182d4bf169ed310d256c8 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 20:41:49 -0700 Subject: [PATCH 061/210] Create show page for product. Add create_order action to application_controller.rb so it is accessible to order controller and product controller. Products_controller_test of add_product_to_cart action now passing. --- app/controllers/application_controller.rb | 12 ++++++++++ app/controllers/orders_controller.rb | 24 +++++++++++--------- app/controllers/products_controller.rb | 5 +++- app/models/order.rb | 2 +- app/views/products/show.html.erb | 16 +++++++++++++ test/controllers/orders_controller_test.rb | 1 - test/controllers/products_controller_test.rb | 11 ++++++++- 7 files changed, 56 insertions(+), 15 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694e9d..2b6190fb57 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,15 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + + def create_order + @order = Order.new + @order.status = "pending" + + if @order.save + session[:order_id] = @order.id + flash[:success] = "Successfully created pending order." + else + flash[:error] = "Could not initialize pending order." + end + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 64d791a934..24353c6582 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,7 @@ class OrdersController < ApplicationController #TODO: clean up with controller filters #TODO: discuss rules around destroy action. +#TODO: does it make sense to have flash messages for Order.create??? def index @orders = Order.all end @@ -18,17 +19,18 @@ def new end def create - @order = Order.new - @order.status = "pending" - - if @order.save - session[:order_id] = @order.id - flash[:success] = "Order added successfully" - redirect_to root_path - else - flash[:error] = "Order couldn't be processed." - render :new - end + create_order + # @order = Order.new + # @order.status = "pending" + # + # if @order.save + # session[:order_id] = @order.id + # flash[:success] = "Order added successfully" + # redirect_to root_path + # else + # flash[:error] = "Order couldn't be processed." + # render :new + # end end def edit diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 30872eebc8..0b5d6b64c9 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -50,9 +50,12 @@ def destroy end def add_product_to_cart + if Order.find_by(id: session[:order_id]) == nil + create_order + end + @product = Product.find_by(id: params[:id]) if @product.remove_one_from_stock - ap session[:order_id] order = Order.find_by(id: session[:order_id]) order.products << @product flash[:success] = "product added to cart" diff --git a/app/models/order.rb b/app/models/order.rb index e02b256138..0d43683e2b 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -10,8 +10,8 @@ class Order < ApplicationRecord validates :card_cvv, presence: true, if: :completed? validates :zip_code, presence: true, if: :completed? - def completed? self.status == "complete" end + end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e69de29bb2..c963c1ddaf 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -0,0 +1,16 @@ +

        Product#show

        + +

        <%= @product.name %>

        + +

        $<%= @product.price %>

        + +<% if @product.quantity_avail > 0 %> +

        In Stock

        + <% if @product.quantity_avail <= 5 %> +

        Only <%= @product.quantity_avail%> left!

        + <% end %> +<% else %> +

        Out of Stock

        +<% end %> + +<%= button_to "Add to cart", add_product_path(@product), method: :patch %> diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index ab5968bdf0..0bc23f9274 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -35,7 +35,6 @@ #Act post orders_path #Assert - must_respond_with :redirect Order.count.must_equal start_count + 1 end it "sets the session[:order_id] to the id of the created order" do diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 615e9fc94d..9651c33ad2 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -83,8 +83,17 @@ order.products.each do |prod| prod.name.must_equal "Pointy Hat" end + end + + it "changes the product quantity if successful" do product = products(:pointy_hat) - product.quantity_avail.must_equal 3 + product.quantity_avail.must_equal 5 + + patch add_product_path(product.id) + patch add_product_path(product.id) + + #do not re-load the fixture: it's fixed! + Product.find(products(:pointy_hat).id).quantity_avail.must_equal 3 end end # describe "update" do From 9ff370b6c7aa094288975a659a8eb6d7468ab320 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 20:43:33 -0700 Subject: [PATCH 062/210] Add comment --- test/controllers/products_controller_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 9651c33ad2..a82520251e 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -92,7 +92,7 @@ patch add_product_path(product.id) patch add_product_path(product.id) - #do not re-load the fixture: it's fixed! + #do not re-load the fixture: it's fixed, so it will never chaaaaange! Product.find(products(:pointy_hat).id).quantity_avail.must_equal 3 end end From 30eb7575fa73c207511b2a68c402f7f9f8a27ac5 Mon Sep 17 00:00:00 2001 From: Gale Harrington Date: Thu, 19 Oct 2017 20:55:20 -0700 Subject: [PATCH 063/210] Link to product show page in index --- app/controllers/products_controller.rb | 2 +- app/views/products/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0b5d6b64c9..ce5195c930 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -59,7 +59,7 @@ def add_product_to_cart order = Order.find_by(id: session[:order_id]) order.products << @product flash[:success] = "product added to cart" - redirect_to root_path + redirect_to products_path else flash[:error] = "product not available" redirect_to products_path, status: :bad_request diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index b25c270b06..31ae2a872b 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -3,7 +3,7 @@ <% @products.each do |product| %>
        - Product: <%= product.name %> + Product: <%= link_to product.name, product_path(product.id) %> Price: <%= product.price %> Quantity: <%= product.quantity_avail %> Sold By: <%= product.merchant.username %> From edb2126ae8993b99fecb8c282fd450d4dbd0b46e Mon Sep 17 00:00:00 2001 From: Maria McGrew Date: Thu, 19 Oct 2017 23:49:16 -0700 Subject: [PATCH 064/210] products by category tests passing --- app/controllers/products_controller.rb | 14 +- app/views/products/index.html.erb | 4 + config/routes.rb | 7 +- test/controllers/products_controller_test.rb | 14 +- test/controllers/reviews_controller_test.rb | 134 +++++++++---------- 5 files changed, 97 insertions(+), 76 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ce5195c930..7972bd3b61 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -3,6 +3,9 @@ def index if params[:merchant_id] merchant = Merchant.find_by(id: params[:merchant_id]) @products = merchant.products + elsif + params[:category_id] + @products = Product.includes(:categories).where(categories: { id: params[:category_id]}) else @products = Product.all end @@ -13,14 +16,14 @@ def new end def create - @product = Product.new(name: params[:product][:name], price: params[:product][:price], quantity_avail: params[:product][:quantity_avail], merchant: params[:product][:merchant] ) + @product = Product.new product_params if @product.save flash[:status] = :success flash[:result_text] = "Successfully created your product!" - redirect_to product_path + redirect_to product_path(@product.id) else flash[:status] = :failure - flash[:result_text] = "Could not create #{@category.name} category." + flash[:result_text] = "Could not create #{@product.name}." flash[:messages] = @product.errors.messages render :new, status: :bad_request end @@ -70,4 +73,9 @@ def add_product_to_cart # @product = Product.find_by(id: params[:id]) # # end + + private + def product_params + params.require(:product).permit(:name, :price, :quantity_avail, :merchant_id) + end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 31ae2a872b..54289e6d4e 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -11,3 +11,7 @@
        <% end %>
        + +<% Category.all.each do |category| %> + <%= link_to category.name, category_products_path(category.id) %> +<% end %> diff --git a/config/routes.rb b/config/routes.rb index fecc91b09f..d9d161a18b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,7 @@ resources :categories resources :orders - + resources :products do resources :reviews end @@ -12,7 +12,10 @@ resources :merchants do get '/products', to: 'products#index' end - + + resources :categories do + resources :products, only: [:index] + end patch 'products/:id/add_product_to_cart', to: 'products#add_product_to_cart', as: 'add_product' diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index a82520251e..44e5886ba0 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -34,10 +34,9 @@ # post products_path, params: {product: {name: "creepy things", quantity_avail: 4, price: 9.99, merchant_id: merchants(:spooky)}} # must_respond_with :redirect # must_redirect_to product_path(Product.last.id) - - # proc { - # post products_path, params: {product: {name: "creepy things", quantity_avail: 4, price: 9.99, merchant: merchants(:witch)}} - # }.must_change 'Category.count', 1 + proc { + post products_path, params: { product: { name: "creepy things", quantity_avail: 4, price: 9.99, merchant_id: Merchant.first.id}} + }.must_change 'Product.count', 1 end end @@ -122,4 +121,11 @@ end end + + describe "product by category" do + it "Should get products by category" do + get category_products_path(categories(:brooms).id) + must_respond_with :success + end + end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 6e6405150e..8c71ecfb0b 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,70 +2,70 @@ #test for create and destroy are commented out and not working #might need edge cases #test for 404 missing failing -describe ReviewsController do - describe "index" do - it "succeeds with many reviews" do - Review.count.must_be :>, 0 - - get reviews_path - must_respond_with :success - end - it "succeeds with no reviews" do - Review.destroy_all - - get reviews_path - must_respond_with :success - end - end - describe "new" do - it "reviews" do - get new_review_path - must_respond_with :success - end - end - describe "create" do - it "should be able to create a review" do - proc { - post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } - }.must_change 'Review.count', 1 - - must_respond_with :redirect - must_redirect_to product_path(Review.last.product_id) -end - - it "should rerender the form if it can't create the review" do - proc { - post reviews_path, params: { review: {rating: -1, text_review: "Smokin.", product_id: products(:pointy_hat).id} } - }.must_change 'Review.count', 0 - - must_respond_with :bad_request - end - - end - describe "show" do - it "can show a review" do - get review_path( reviews(:reviewer).id ) - - must_respond_with :success - end - it "should respond with 404 if it's not found" do - review = Review.last.id + 1 - - get review_path(review) - - must_respond_with :not_found - end - end - describe "destroy" do - #need to either fix seed data or test differently - it "can delete a review" do - - review = reviews(:reviewer) - delete review_path( review.id ) - must_redirect_to products_path - - - Review.find_by(id: review.id).must_be_nil - end - end -end +# describe ReviewsController do +# describe "index" do +# it "succeeds with many reviews" do +# Review.count.must_be :>, 0 +# +# get reviews_path +# must_respond_with :success +# end +# it "succeeds with no reviews" do +# Review.destroy_all +# +# get reviews_path +# must_respond_with :success +# end +# end +# describe "new" do +# it "reviews" do +# get new_review_path +# must_respond_with :success +# end +# end +# describe "create" do +# it "should be able to create a review" do +# proc { +# post reviews_path, params: { review: {rating: 3, text_review: "Smokin.", product_id: products(:pointy_hat).id} } +# }.must_change 'Review.count', 1 +# +# must_respond_with :redirect +# must_redirect_to product_path(Review.last.product_id) +# end +# +# it "should rerender the form if it can't create the review" do +# proc { +# post reviews_path, params: { review: {rating: -1, text_review: "Smokin.", product_id: products(:pointy_hat).id} } +# }.must_change 'Review.count', 0 +# +# must_respond_with :bad_request +# end +# +# end +# describe "show" do +# it "can show a review" do +# get review_path( reviews(:reviewer).id ) +# +# must_respond_with :success +# end +# it "should respond with 404 if it's not found" do +# review = Review.last.id + 1 +# +# get review_path(review) +# +# must_respond_with :not_found +# end +# end +# describe "destroy" do +# #need to either fix seed data or test differently +# it "can delete a review" do +# +# review = reviews(:reviewer) +# delete review_path( review.id ) +# must_redirect_to products_path +# +# +# Review.find_by(id: review.id).must_be_nil +# end +# end +# end From 054cc92bcf945978deb04b6f2e6173671dd6edaf Mon Sep 17 00:00:00 2001 From: Kimberley Mackenzie Date: Fri, 20 Oct 2017 09:11:48 -0700 Subject: [PATCH 065/210] Dropdown menus. --- app/assets/stylesheets/application.css | 73 + app/views/layouts/application.html.erb | 39 +- ...fest-824e727ed97b6131d637fca833e48947.json | 2 +- ...d4d67c190a414d54012913afb7db302427c76ae.js | 31046 ++++++++++++++++ ...67c190a414d54012913afb7db302427c76ae.js.gz | Bin 0 -> 212662 bytes ...ebef8d6f0ba458109487abb984f39133b13e3b.css | 7156 ++++ ...f8d6f0ba458109487abb984f39133b13e3b.css.gz | Bin 0 -> 22425 bytes ...72aa773e7661421ba3753fabb7e11c3174b0149.js | 185 + ...a773e7661421ba3753fabb7e11c3174b0149.js.gz | Bin 0 -> 1746 bytes 9 files changed, 38487 insertions(+), 14 deletions(-) create mode 100644 public/assets/application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js create mode 100644 public/assets/application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js.gz create mode 100644 public/assets/application-fc6999c903bb5b5e51012c9d02ebef8d6f0ba458109487abb984f39133b13e3b.css create mode 100644 public/assets/application-fc6999c903bb5b5e51012c9d02ebef8d6f0ba458109487abb984f39133b13e3b.css.gz create mode 100644 public/assets/home-b2eedfa12c62567bd67e8be2d72aa773e7661421ba3753fabb7e11c3174b0149.js create mode 100644 public/assets/home-b2eedfa12c62567bd67e8be2d72aa773e7661421ba3753fabb7e11c3174b0149.js.gz diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index cf25395bac..32c5428376 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -21,6 +21,10 @@ color: white; } +ul, ol { + list-style: none; +} + body { width: 100%; } @@ -33,18 +37,87 @@ body { } +.row .nav-links { + display: inline-block; +} + .nav-links { font-size: 1.5rem; float: right; + display: inline-block; } .nav-links a { padding: .5rem; + +} + + +.navigation .dropdown a{ + font-family: 'Arvo', serif; + font-size: 2em; + color: #0F5364; + text-shadow: 1; + text-decoration: none; +} + +.dropdown a:hover { + color: blue; +} + +.dropdown-button-view, .dropdown-button-create { + color: black; + padding: 0; + font-size: 3em; + border: none; + cursor: pointer; + font-family: 'Arvo', serif; + margin: 0; +} + +.dropdown { + position: relative; + display: flex; + text-align: right; + margin-left: 10em; } +.dropdown-content-view, .dropdown-content-create { + display: none; + position: absolute; + width: 20em; + min-width: 160px; + text-align: left; + overflow: visible; + margin: 0; + z-index: 1; +} + +.dropdown-content-view a, .dropdown-content-create a { + padding: 12px 16px; + text-decoration: none; + display: block; +} + +.dropdown:hover .dropdown-content-view { + display: block; +} + +.dropdown:hover .dropdown-content-create { + display: block; +} + + + + + + .header { margin: 1rem 0rem 1rem 0rem; width: 100%; + display: flex; + justify-content: center; + align-items: center; } .all-products, .all-merchants, .all-categories { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 858179cba1..e6b302eb21 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -16,19 +16,32 @@ -
        -
        - - - - <%= link_to "Browse Products", products_path %> - <%= link_to "Browse Merchants", merchants_path %> - <%= link_to "Browse Categories", categories_path %> - <%= link_to "Home", root_path %> - - -
        -
        + + + + <%= yield %> diff --git a/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json b/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json index 2f88b6a0a8..a36b552472 100644 --- a/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json +++ b/public/assets/.sprockets-manifest-824e727ed97b6131d637fca833e48947.json @@ -1 +1 @@ -{"files":{"home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js":{"logical_path":"home.js","mtime":"2017-10-17T17:10:52-07:00","size":5071,"digest":"c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5","integrity":"sha256-xbpShLLifyC9mBaAOpifd98m2QtsX6MDAZzHwAh3uKU="},"application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js":{"logical_path":"application.js","mtime":"2017-10-18T18:21:55-07:00","size":738085,"digest":"8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d","integrity":"sha256-itb4Z7/wqrUbMbcgq3CxEzyGkWME54xa4+xvd6R16G0="},"application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css":{"logical_path":"application.css","mtime":"2017-10-18T15:09:51-07:00","size":264628,"digest":"1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa","integrity":"sha256-H4ovUebvz9QuVU9KmFsoZ2Ldnl3Xv2dPriVFjBnqdvo="}},"assets":{"home.js":"home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js","application.js":"application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js","application.css":"application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css"}} \ No newline at end of file +{"files":{"home-c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5.js":{"logical_path":"home.js","mtime":"2017-10-17T17:10:52-07:00","size":5071,"digest":"c5ba5284b2e27f20bd9816803a989f77df26d90b6c5fa303019cc7c00877b8a5","integrity":"sha256-xbpShLLifyC9mBaAOpifd98m2QtsX6MDAZzHwAh3uKU="},"application-8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d.js":{"logical_path":"application.js","mtime":"2017-10-18T18:21:55-07:00","size":738085,"digest":"8ad6f867bff0aab51b31b720ab70b1133c86916304e78c5ae3ec6f77a475e86d","integrity":"sha256-itb4Z7/wqrUbMbcgq3CxEzyGkWME54xa4+xvd6R16G0="},"application-1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa.css":{"logical_path":"application.css","mtime":"2017-10-18T15:09:51-07:00","size":264628,"digest":"1f8a2f51e6efcfd42e554f4a985b286762dd9e5dd7bf674fae25458c19ea76fa","integrity":"sha256-H4ovUebvz9QuVU9KmFsoZ2Ldnl3Xv2dPriVFjBnqdvo="},"home-b2eedfa12c62567bd67e8be2d72aa773e7661421ba3753fabb7e11c3174b0149.js":{"logical_path":"home.js","mtime":"2017-10-19T10:06:10-07:00","size":5268,"digest":"b2eedfa12c62567bd67e8be2d72aa773e7661421ba3753fabb7e11c3174b0149","integrity":"sha256-su7foSxiVnvWfovi1yqnc+dmFCG6N1P6u34RwxdLAUk="},"application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js":{"logical_path":"application.js","mtime":"2017-10-19T15:18:15-07:00","size":1031864,"digest":"9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae","integrity":"sha256-nZ6DNLcS8eCDYoyvPU1nwZCkFNVAEpE6+32zAkJ8dq4="},"application-fc6999c903bb5b5e51012c9d02ebef8d6f0ba458109487abb984f39133b13e3b.css":{"logical_path":"application.css","mtime":"2017-10-19T16:08:31-07:00","size":264685,"digest":"fc6999c903bb5b5e51012c9d02ebef8d6f0ba458109487abb984f39133b13e3b","integrity":"sha256-/GmZyQO7W15RASydAuvvjW8LpFgQlIeruYTzkTOxPjs="}},"assets":{"home.js":"home-b2eedfa12c62567bd67e8be2d72aa773e7661421ba3753fabb7e11c3174b0149.js","application.js":"application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js","application.css":"application-fc6999c903bb5b5e51012c9d02ebef8d6f0ba458109487abb984f39133b13e3b.css"}} \ No newline at end of file diff --git a/public/assets/application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js b/public/assets/application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js new file mode 100644 index 0000000000..e6c6e6b021 --- /dev/null +++ b/public/assets/application-9d9e8334b712f1e083628caf3d4d67c190a414d54012913afb7db302427c76ae.js @@ -0,0 +1,31046 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "
        " + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
        a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
        ", "
        " ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
        " ], + tr: [ 2, "", "
        " ], + col: [ 2, "", "
        " ], + td: [ 3, "", "
        " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
        ", "
        " ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
        " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "