From 5d2266dbe4a034c446bba62ba2fcc1dc33c8331d Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 16:25:08 -0700 Subject: [PATCH 01/50] Initial Rails setup --- .gitignore | 17 ++ Gemfile | 64 ++++++ Gemfile.lock | 202 ++++++++++++++++++ Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 16 ++ app/assets/javascripts/cable.js | 13 ++ app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.css | 15 ++ 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 | 14 ++ 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 | 34 +++ bin/spring | 17 ++ bin/update | 29 +++ config.ru | 5 + config/application.rb | 19 ++ config/boot.rb | 3 + config/cable.yml | 9 + config/database.yml | 85 ++++++++ config/environment.rb | 5 + config/environments/development.rb | 54 +++++ config/environments/production.rb | 86 ++++++++ config/environments/test.rb | 42 ++++ .../application_controller_renderer.rb | 6 + config/initializers/assets.rb | 11 + 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/new_framework_defaults.rb | 24 +++ config/initializers/session_store.rb | 3 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 23 ++ config/puma.rb | 47 ++++ config/routes.rb | 3 + config/secrets.yml | 22 ++ config/spring.rb | 6 + db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 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 | 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/test_helper.rb | 26 +++ tmp/.keep | 0 vendor/assets/javascripts/.keep | 0 vendor/assets/stylesheets/.keep | 0 74 files changed, 1228 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/application.css 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 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/new_framework_defaults.rb create mode 100644 config/initializers/session_store.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 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/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/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/assets/javascripts/.keep create mode 100644 vendor/assets/stylesheets/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..48fb168f64 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# 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 + +# Ignore Byebug command history file. +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..7d58322da3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,64 @@ +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.0.2' +# Use postgresql as the database for Active Record +gem 'pg', '~> 0.18' +# Use Puma as the app server +gem 'puma', '~> 3.0' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'therubyracer', platforms: :ruby + +# Use jquery as the JavaScript library +gem 'jquery-rails' +# 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', platform: :mri +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' + # 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] + +group :development do + gem 'better_errors' + gem 'pry-rails' +end + +gem 'awesome_print' +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..4294ff3b60 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,202 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.0.2) + actionpack (= 5.0.2) + nio4r (>= 1.2, < 3.0) + websocket-driver (~> 0.6.1) + actionmailer (5.0.2) + actionpack (= 5.0.2) + actionview (= 5.0.2) + activejob (= 5.0.2) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.0.2) + actionview (= 5.0.2) + activesupport (= 5.0.2) + rack (~> 2.0) + rack-test (~> 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.0.2) + activesupport (= 5.0.2) + builder (~> 3.1) + erubis (~> 2.7.0) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.0.2) + activesupport (= 5.0.2) + globalid (>= 0.3.6) + activemodel (5.0.2) + activesupport (= 5.0.2) + activerecord (5.0.2) + activemodel (= 5.0.2) + activesupport (= 5.0.2) + arel (~> 7.0) + activesupport (5.0.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + ansi (1.5.0) + arel (7.1.4) + awesome_print (1.7.0) + better_errors (2.1.1) + coderay (>= 1.0.0) + erubis (>= 2.6.6) + rack (>= 0.9.0) + bindex (0.5.0) + builder (3.2.3) + byebug (9.0.6) + coderay (1.1.1) + coffee-rails (4.2.1) + coffee-script (>= 2.2.0) + railties (>= 4.0.0, < 5.2.x) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + concurrent-ruby (1.0.5) + erubis (2.7.0) + execjs (2.7.0) + ffi (1.9.18) + globalid (0.3.7) + activesupport (>= 4.1.0) + i18n (0.8.1) + jbuilder (2.6.3) + activesupport (>= 3.0.0, < 5.2) + multi_json (~> 1.2) + jquery-rails (4.3.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + loofah (2.0.3) + nokogiri (>= 1.5.9) + mail (2.6.4) + mime-types (>= 1.16, < 4) + method_source (0.8.2) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_portile2 (2.1.0) + minitest (5.10.1) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.1.14) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + multi_json (1.12.1) + nio4r (2.0.0) + nokogiri (1.7.1) + mini_portile2 (~> 2.1.0) + pg (0.20.0) + pry (0.10.4) + coderay (~> 1.1.0) + method_source (~> 0.8.1) + slop (~> 3.4) + pry-rails (0.3.6) + pry (>= 0.10.4) + puma (3.8.2) + rack (2.0.1) + rack-test (0.6.3) + rack (>= 1.0) + rails (5.0.2) + actioncable (= 5.0.2) + actionmailer (= 5.0.2) + actionpack (= 5.0.2) + actionview (= 5.0.2) + activejob (= 5.0.2) + activemodel (= 5.0.2) + activerecord (= 5.0.2) + activesupport (= 5.0.2) + bundler (>= 1.3.0, < 2.0) + railties (= 5.0.2) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.2) + activesupport (>= 4.2.0, < 6.0) + nokogiri (~> 1.6) + rails-html-sanitizer (1.0.3) + loofah (~> 2.0) + railties (5.0.2) + actionpack (= 5.0.2) + activesupport (= 5.0.2) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.0.0) + rb-fsevent (0.9.8) + rb-inotify (0.9.8) + ffi (>= 0.5.0) + ruby-progressbar (1.8.1) + sass (3.4.23) + 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) + slop (3.6.0) + spring (2.0.1) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.0) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.19.4) + thread_safe (0.3.6) + tilt (2.0.7) + turbolinks (5.0.1) + turbolinks-source (~> 5) + turbolinks-source (5.0.0) + tzinfo (1.2.3) + thread_safe (~> 0.1) + uglifier (3.2.0) + execjs (>= 0.3.0, < 3) + web-console (3.5.0) + 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) + +PLATFORMS + ruby + +DEPENDENCIES + awesome_print + better_errors + byebug + coffee-rails (~> 4.2) + jbuilder (~> 2.5) + jquery-rails + listen (~> 3.0.5) + minitest-rails + minitest-reporters + pg (~> 0.18) + pry-rails + puma (~> 3.0) + rails (~> 5.0.2) + sass-rails (~> 5.0) + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +BUNDLED WITH + 1.14.6 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..b12018d099 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,16 @@ +// 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, vendor/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 jquery +//= require jquery_ujs +//= require turbolinks +//= require_tree . diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..71ee1e66de --- /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/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..0ebd7fe829 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * 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, vendor/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 + */ 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..6af511b830 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + MediaRanker + <%= csrf_meta_tags %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= 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..e620b4dadb --- /dev/null +++ b/bin/setup @@ -0,0 +1,34 @@ +#!/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') + + # 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/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..183a13c8e5 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,19 @@ +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 MediaRanker + class Application < Rails::Application + # Force new test files to be generated in the minitest-spec style + config.generators do |g| + g.test_framework :minitest, spec: true + end + # 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..0bbde6f74f --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,9 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..166dfd3a4a --- /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: MediaRanker_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: MediaRanker + + # 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: MediaRanker_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: MediaRanker_production + username: MediaRanker + password: <%= ENV['MEDIARANKER_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..6f7197045a --- /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=172800' + } + 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..53c750f891 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,86 @@ +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 + + # 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 = "MediaRanker_#{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..30587ef6d5 --- /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=3600' + } + + # 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..51639b67a0 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..01ef3e6630 --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,11 @@ +# 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 + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# Rails.application.config.assets.precompile += %w( search.js ) 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/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb new file mode 100644 index 0000000000..671abb69a3 --- /dev/null +++ b/config/initializers/new_framework_defaults.rb @@ -0,0 +1,24 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 5.0 upgrade. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Enable per-form CSRF tokens. Previous versions had false. +Rails.application.config.action_controller.per_form_csrf_tokens = true + +# Enable origin-checking CSRF mitigation. Previous versions had false. +Rails.application.config.action_controller.forgery_protection_origin_check = true + +# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`. +# Previous versions had false. +ActiveSupport.to_time_preserves_timezone = true + +# Require `belongs_to` associations by default. Previous versions had false. +Rails.application.config.active_record.belongs_to_required_by_default = true + +# Do not halt callback chains when a callback returns false. Previous versions had true. +ActiveSupport.halt_callback_chains_on_return_false = false + +# Configure SSL options to enable HSTS with subdomains. Previous versions had false. +Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 0000000000..eff282e4bd --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_MediaRanker_session' 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..0653957166 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,23 @@ +# 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. +# +# 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..c7f311f811 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,47 @@ +# 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 }.to_i +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! + +# 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 `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, 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..83b24900d0 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,22 @@ +# 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. + +development: + secret_key_base: 5395166b9a7e98ef1ca627a6d81e78360c5110629f5a6dc6f0440cc37359a74581b3d68d92dbecd136a30c8834904dd70dbb35a3f51f63732daee7380b1b281f + +test: + secret_key_base: 37f51e28ff3e671512efc12d64366f2522fb763082d6dcffaaf7387a6bb0e81e558dee2e0eed2f3429cfaf0b9af9073a31326b168d6736e7b28f3b41a85a8653 + +# Do not keep production secrets in the repository, +# instead read values from the environment. +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/public/404.html b/public/404.html new file mode 100644 index 0000000000..b612547fc2 --- /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..a21f82b3bd --- /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..061abc587d --- /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..3c9c7c01f3 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / 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/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..10594a3248 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,26 @@ +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/assets/javascripts/.keep b/vendor/assets/javascripts/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep new file mode 100644 index 0000000000..e69de29bb2 From 14a05ef5cb802e976c26923091d2caa837b7882e Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 19:33:51 -0700 Subject: [PATCH 02/50] Set up models for User, Vote, and Work: created erd using gem --- Gemfile | 2 +- Gemfile.lock | 8 ++++ app/assets/javascripts/users.coffee | 3 ++ app/assets/javascripts/votes.coffee | 3 ++ app/assets/javascripts/works.coffee | 3 ++ app/assets/stylesheets/users.scss | 3 ++ app/assets/stylesheets/votes.scss | 3 ++ app/assets/stylesheets/works.scss | 3 ++ app/controllers/users_controller.rb | 2 + app/controllers/votes_controller.rb | 2 + app/controllers/works_controller.rb | 2 + app/helpers/users_helper.rb | 2 + app/helpers/votes_helper.rb | 2 + app/helpers/works_helper.rb | 2 + app/models/user.rb | 4 ++ app/models/vote.rb | 4 ++ app/models/work.rb | 8 ++++ db/migrate/20170410233214_create_works.rb | 13 +++++ db/migrate/20170410233326_create_users.rb | 9 ++++ db/migrate/20170410233348_create_votes.rb | 8 ++++ ...0170410235719_user_to_vote_relationship.rb | 5 ++ ...0170410235740_work_to_vote_relationship.rb | 5 ++ db/schema.rb | 45 ++++++++++++++++++ erd.pdf | Bin 0 -> 29566 bytes test/controllers/users_controller_test.rb | 7 +++ test/controllers/votes_controller_test.rb | 7 +++ test/controllers/works_controller_test.rb | 7 +++ test/fixtures/users.yml | 7 +++ test/fixtures/votes.yml | 11 +++++ test/fixtures/works.yml | 15 ++++++ test/models/user_test.rb | 9 ++++ test/models/vote_test.rb | 9 ++++ test/models/work_test.rb | 9 ++++ 33 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/users.coffee create mode 100644 app/assets/javascripts/votes.coffee create mode 100644 app/assets/javascripts/works.coffee create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/assets/stylesheets/votes.scss create mode 100644 app/assets/stylesheets/works.scss create mode 100644 app/controllers/users_controller.rb create mode 100644 app/controllers/votes_controller.rb create mode 100644 app/controllers/works_controller.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/helpers/votes_helper.rb create mode 100644 app/helpers/works_helper.rb create mode 100644 app/models/user.rb create mode 100644 app/models/vote.rb create mode 100644 app/models/work.rb create mode 100644 db/migrate/20170410233214_create_works.rb create mode 100644 db/migrate/20170410233326_create_users.rb create mode 100644 db/migrate/20170410233348_create_votes.rb create mode 100644 db/migrate/20170410235719_user_to_vote_relationship.rb create mode 100644 db/migrate/20170410235740_work_to_vote_relationship.rb create mode 100644 db/schema.rb create mode 100644 erd.pdf create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/controllers/votes_controller_test.rb create mode 100644 test/controllers/works_controller_test.rb create mode 100644 test/fixtures/users.yml create mode 100644 test/fixtures/votes.yml create mode 100644 test/fixtures/works.yml create mode 100644 test/models/user_test.rb create mode 100644 test/models/vote_test.rb create mode 100644 test/models/work_test.rb diff --git a/Gemfile b/Gemfile index 7d58322da3..f350a0af6e 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ git_source(:github) do |repo_name| "https://github.com/#{repo_name}.git" end - +gem "rails-erd" # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.0.2' # Use postgresql as the database for Active Record diff --git a/Gemfile.lock b/Gemfile.lock index 4294ff3b60..f216afcbc6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -48,6 +48,7 @@ GEM bindex (0.5.0) builder (3.2.3) byebug (9.0.6) + choice (0.2.0) coderay (1.1.1) coffee-rails (4.2.1) coffee-script (>= 2.2.0) @@ -121,6 +122,11 @@ GEM rails-dom-testing (2.0.2) activesupport (>= 4.2.0, < 6.0) nokogiri (~> 1.6) + rails-erd (1.5.0) + activerecord (>= 3.2) + activesupport (>= 3.2) + choice (~> 0.2.0) + ruby-graphviz (~> 1.2) rails-html-sanitizer (1.0.3) loofah (~> 2.0) railties (5.0.2) @@ -133,6 +139,7 @@ GEM rb-fsevent (0.9.8) rb-inotify (0.9.8) ffi (>= 0.5.0) + ruby-graphviz (1.2.3) ruby-progressbar (1.8.1) sass (3.4.23) sass-rails (5.0.6) @@ -190,6 +197,7 @@ DEPENDENCIES pry-rails puma (~> 3.0) rails (~> 5.0.2) + rails-erd sass-rails (~> 5.0) spring spring-watcher-listen (~> 2.0.0) diff --git a/app/assets/javascripts/users.coffee b/app/assets/javascripts/users.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/users.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/votes.coffee b/app/assets/javascripts/votes.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/votes.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/works.coffee b/app/assets/javascripts/works.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/works.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..31a2eacb84 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users 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/votes.scss b/app/assets/stylesheets/votes.scss new file mode 100644 index 0000000000..9a6720f80e --- /dev/null +++ b/app/assets/stylesheets/votes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Votes 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/works.scss b/app/assets/stylesheets/works.scss new file mode 100644 index 0000000000..5618452f3e --- /dev/null +++ b/app/assets/stylesheets/works.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Works 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/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..3e74dea87f --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,2 @@ +class UsersController < ApplicationController +end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb new file mode 100644 index 0000000000..ffdb2760e0 --- /dev/null +++ b/app/controllers/votes_controller.rb @@ -0,0 +1,2 @@ +class VotesController < ApplicationController +end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb new file mode 100644 index 0000000000..56b02c9f2e --- /dev/null +++ b/app/controllers/works_controller.rb @@ -0,0 +1,2 @@ +class WorksController < ApplicationController +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/helpers/votes_helper.rb b/app/helpers/votes_helper.rb new file mode 100644 index 0000000000..5a82eed07d --- /dev/null +++ b/app/helpers/votes_helper.rb @@ -0,0 +1,2 @@ +module VotesHelper +end diff --git a/app/helpers/works_helper.rb b/app/helpers/works_helper.rb new file mode 100644 index 0000000000..ccb78c2b73 --- /dev/null +++ b/app/helpers/works_helper.rb @@ -0,0 +1,2 @@ +module WorksHelper +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000000..c46e64fc03 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,4 @@ +class User < ApplicationRecord + has_many :votes + validates :name, presence: true +end diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000000..68bda1c814 --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,4 @@ +class Vote < ApplicationRecord + belongs_to :work + belongs_to :user +end diff --git a/app/models/work.rb b/app/models/work.rb new file mode 100644 index 0000000000..a5a8d3f385 --- /dev/null +++ b/app/models/work.rb @@ -0,0 +1,8 @@ +class Work < ApplicationRecord + has_many :votes + + validates :creator, presence: true + validates :category, presence: true + validates :title, presence: true + validates :published, numericality: { only_integer: true, greater_than: 0, less_than: 10000 } +end diff --git a/db/migrate/20170410233214_create_works.rb b/db/migrate/20170410233214_create_works.rb new file mode 100644 index 0000000000..c85ae05b59 --- /dev/null +++ b/db/migrate/20170410233214_create_works.rb @@ -0,0 +1,13 @@ +class CreateWorks < ActiveRecord::Migration[5.0] + def change + create_table :works do |t| + t.string :category + t.string :title + t.string :creator + t.integer :published + t.text :description + + t.timestamps + end + end +end diff --git a/db/migrate/20170410233326_create_users.rb b/db/migrate/20170410233326_create_users.rb new file mode 100644 index 0000000000..9b622cd545 --- /dev/null +++ b/db/migrate/20170410233326_create_users.rb @@ -0,0 +1,9 @@ +class CreateUsers < ActiveRecord::Migration[5.0] + def change + create_table :users do |t| + t.string :name + + t.timestamps + end + end +end diff --git a/db/migrate/20170410233348_create_votes.rb b/db/migrate/20170410233348_create_votes.rb new file mode 100644 index 0000000000..0c1aa1d87b --- /dev/null +++ b/db/migrate/20170410233348_create_votes.rb @@ -0,0 +1,8 @@ +class CreateVotes < ActiveRecord::Migration[5.0] + def change + create_table :votes do |t| + + t.timestamps + end + end +end diff --git a/db/migrate/20170410235719_user_to_vote_relationship.rb b/db/migrate/20170410235719_user_to_vote_relationship.rb new file mode 100644 index 0000000000..f53260b728 --- /dev/null +++ b/db/migrate/20170410235719_user_to_vote_relationship.rb @@ -0,0 +1,5 @@ +class UserToVoteRelationship < ActiveRecord::Migration[5.0] + def change + add_reference :votes, :user, foreign_key: true + end +end diff --git a/db/migrate/20170410235740_work_to_vote_relationship.rb b/db/migrate/20170410235740_work_to_vote_relationship.rb new file mode 100644 index 0000000000..990c7c3541 --- /dev/null +++ b/db/migrate/20170410235740_work_to_vote_relationship.rb @@ -0,0 +1,5 @@ +class WorkToVoteRelationship < ActiveRecord::Migration[5.0] + def change + add_reference :votes, :work, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..66ba4f8bc0 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,45 @@ +# 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: 20170410235740) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "users", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "votes", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "user_id" + t.integer "work_id" + t.index ["user_id"], name: "index_votes_on_user_id", using: :btree + t.index ["work_id"], name: "index_votes_on_work_id", using: :btree + end + + create_table "works", force: :cascade do |t| + t.string "category" + t.string "title" + t.string "creator" + t.integer "published" + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_foreign_key "votes", "users" + add_foreign_key "votes", "works" +end diff --git a/erd.pdf b/erd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe6d94506b982f80f5bf7be38177400eef46ed4d GIT binary patch literal 29566 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 literal 0 HcmV?d00001 diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..89decb54e0 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe UsersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb new file mode 100644 index 0000000000..cf4d03935f --- /dev/null +++ b/test/controllers/votes_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe VotesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb new file mode 100644 index 0000000000..d95073c22e --- /dev/null +++ b/test/controllers/works_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe WorksController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..56066c68af --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/votes.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/works.yml b/test/fixtures/works.yml new file mode 100644 index 0000000000..3e32f60d56 --- /dev/null +++ b/test/fixtures/works.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + category: MyString + title: MyString + creator: MyString + published: 1 + description: MyText + +two: + category: MyString + title: MyString + creator: MyString + published: 1 + description: MyText diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 0000000000..cc862ac2d9 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe User do + let(:user) { User.new } + + it "must be valid" do + value(user).must_be :valid? + end +end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb new file mode 100644 index 0000000000..fc15947bd3 --- /dev/null +++ b/test/models/vote_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Vote do + let(:vote) { Vote.new } + + it "must be valid" do + value(vote).must_be :valid? + end +end diff --git a/test/models/work_test.rb b/test/models/work_test.rb new file mode 100644 index 0000000000..f6fba7104d --- /dev/null +++ b/test/models/work_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Work do + let(:work) { Work.new } + + it "must be valid" do + value(work).must_be :valid? + end +end From 01403d954b486919c96c96232a6c0dcd3d099a17 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 21:53:35 -0700 Subject: [PATCH 03/50] Updated the publication year field type from Integer to a String --- .../20170411042332_remove_published_col.rb | 5 +++++ .../20170411043218_add_publication_year_col.rb | 5 +++++ db/schema.rb | 8 ++++---- erd.pdf | Bin 29566 -> 0 bytes 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20170411042332_remove_published_col.rb create mode 100644 db/migrate/20170411043218_add_publication_year_col.rb delete mode 100644 erd.pdf diff --git a/db/migrate/20170411042332_remove_published_col.rb b/db/migrate/20170411042332_remove_published_col.rb new file mode 100644 index 0000000000..2500f15aef --- /dev/null +++ b/db/migrate/20170411042332_remove_published_col.rb @@ -0,0 +1,5 @@ +class RemovePublishedCol < ActiveRecord::Migration[5.0] + def change + remove_column :works, :published + end +end diff --git a/db/migrate/20170411043218_add_publication_year_col.rb b/db/migrate/20170411043218_add_publication_year_col.rb new file mode 100644 index 0000000000..651d82d16a --- /dev/null +++ b/db/migrate/20170411043218_add_publication_year_col.rb @@ -0,0 +1,5 @@ +class AddPublicationYearCol < ActiveRecord::Migration[5.0] + def change + add_column :works, :publication_year, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 66ba4f8bc0..1092e8fa1b 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: 20170410235740) do +ActiveRecord::Schema.define(version: 20170411043218) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -34,10 +34,10 @@ t.string "category" t.string "title" t.string "creator" - t.integer "published" t.text "description" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "publication_year" end add_foreign_key "votes", "users" diff --git a/erd.pdf b/erd.pdf deleted file mode 100644 index fe6d94506b982f80f5bf7be38177400eef46ed4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29566 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 From 1aaeb1464b1a9627ff9135791774ed2acc7783b3 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 21:54:08 -0700 Subject: [PATCH 04/50] Updated ERD --- erd.pdf | Bin 0 -> 29320 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 erd.pdf diff --git a/erd.pdf b/erd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d49fb920209eaebf31f651eba284ed8899d2e20f GIT binary patch literal 29320 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 Jn1VR+{{xWts%QWJ literal 0 HcmV?d00001 From 5162cec34f979d44e8e700edf89ab2ae717c8c03 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 21:57:32 -0700 Subject: [PATCH 05/50] Update validations for category field in Work --- app/models/work.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/models/work.rb b/app/models/work.rb index a5a8d3f385..b4e64a93e1 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,8 +1,7 @@ class Work < ApplicationRecord has_many :votes - validates :creator, presence: true - validates :category, presence: true + validates :category, presence: true, inclusion: { in: %w(Movie Book Album), + message: "%{value} is not a valid category" }, allow_nil: false validates :title, presence: true - validates :published, numericality: { only_integer: true, greater_than: 0, less_than: 10000 } end From e96870efdf0b4b5911d97361234129203ca848f5 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Mon, 10 Apr 2017 22:38:28 -0700 Subject: [PATCH 06/50] added validations to work model(WIP) --- test/models/work_test.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/models/work_test.rb b/test/models/work_test.rb index f6fba7104d..eaee832675 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -3,7 +3,14 @@ describe Work do let(:work) { Work.new } - it "must be valid" do - value(work).must_be :valid? + describe 'validations' do + it "is invalid without a title" do + work.valid?.must_equal false + end + + it "is invlaid without a valid category" do + work.valid?.must_equal false + end end + end From 72e1ba702d08f113ddb927314817519f1074cb3c Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 00:04:01 -0700 Subject: [PATCH 07/50] Added data for testing work model --- test/fixtures/works.yml | 73 +++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 3e32f60d56..a162eda5a3 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -1,15 +1,62 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - category: MyString - title: MyString - creator: MyString - published: 1 - description: MyText - -two: - category: MyString - title: MyString - creator: MyString - published: 1 - description: MyText +# VALID WORK DATA +# work with complete data +lee: + category: book + title: Hidden Figures + creator: Margot Lee Shetterly + publication_year: 2016 + description: Good book that came before the movie + +# work without description +dan: + category: album + title: Countdown to Ecstasy + creator: Steely Dan + publication_year: 1973 + description: + +# work without creator +kinney: + category: album + title: Call the Doctor + creator: + publication_year: 1996 + description: N/A + +# work without publication_year +belt: + category: album + title: Time to Go Home + creator: Chastity Belt + publication_year: + description: N/A +# END VALID DATA + +# INVALID DATA +# work without a title +badlee: + category: book + title: + creator: Margot Lee Shetterly + publication_year: 2016 + description: Good book that came before the movie + +# work without a category +baddan: + category: + title: Countdown to Ecstasy + creator: Steely Dan + publication_year: 1973 + description: N/A + +# work with a invalid category +badbelt: + category: performance + title: Time to Go Home + creator: Chastity Belt + publication_year: 1234 + description: N/A + +# END INVALID WORK DATA From a0338aa975eaf30c3df2e5311d07533e0ee2f74c Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 00:05:17 -0700 Subject: [PATCH 08/50] finished tests for Work --- test/models/work_test.rb | 42 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/test/models/work_test.rb b/test/models/work_test.rb index eaee832675..1049354b19 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -3,14 +3,52 @@ describe Work do let(:work) { Work.new } - describe 'validations' do + describe "validations" do it "is invalid without a title" do + work = works(:badlee) work.valid?.must_equal false + work.errors.messages.must_include :title end - it "is invlaid without a valid category" do + it "is valid with a title" do + works(:lee).valid?.must_equal true + end + + it "is invlaid without a category" do + work = works(:baddan) work.valid?.must_equal false + work.errors.messages.must_include :category + end + + it "is invlaid with an invalid category" do + work = works(:badbelt) + work.valid?.must_equal false + work.errors.messages.must_include :category + end + + it "is valid with a appropriate category" do + works(:lee).valid?.must_equal true + end + + it "is valid without a publication_year" do + works(:belt).valid?.must_equal true + end + + it "is valid without a creator" do + works(:kinney).valid?.must_equal true + end + + it "is valid without a description" do + works(:dan).valid?.must_equal true end end + describe "Entity Relationship" do + it "can access Vote objects" do + work = works(:lee) + user = User.create(name: "ken") + vote = Vote.create(user_id: user.id, work_id: work.id) + work.votes[0].class.must_equal Vote + end + end end From f7272ed5c429339c18faae008337996a70cb5828 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 00:07:03 -0700 Subject: [PATCH 09/50] updated validations for the work category field --- app/models/work.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/work.rb b/app/models/work.rb index b4e64a93e1..83ee9ad4e2 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,7 +1,7 @@ class Work < ApplicationRecord has_many :votes - validates :category, presence: true, inclusion: { in: %w(Movie Book Album), + validates :category, presence: true, inclusion: { in: %w(movie book album), message: "%{value} is not a valid category" }, allow_nil: false validates :title, presence: true end From 0a19ea2747a167c32e9253fe1051f2fafc1027e2 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 16:49:23 -0700 Subject: [PATCH 10/50] added tests for custom methods for Work --- test/models/work_test.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 1049354b19..76f41152e7 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -49,6 +49,21 @@ user = User.create(name: "ken") vote = Vote.create(user_id: user.id, work_id: work.id) work.votes[0].class.must_equal Vote + work.votes.size.must_equal 1 end - end + end + + describe "Custom Methods" do + it "can return a work object with the most votes" do + work = works(:lee) + user = User.create(name: "ken") + vote = Vote.create(user_id: user.id, work_id: work.id) + Work.spotlight.must_equal work + end + + it "can return a random work object when there's no votes" do + Work.spotlight.wont_be_nil + Work.spotlight.class.must_equal Work + end + end end From 8fd8ce2e73715d8fbf231aab7e17c0b01fe33699 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 16:50:54 -0700 Subject: [PATCH 11/50] Updated logic in Model and Controller for custom method in Work --- app/controllers/works_controller.rb | 56 +++++++++++++++++++++++++++++ app/models/work.rb | 27 ++++++++++++-- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 56b02c9f2e..339aa1e80c 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,2 +1,58 @@ class WorksController < ApplicationController + def index + @works = Work.all + @spotlight_work = Work.spotlight + end + + def show + @result_work = Work.find(params[:id]) + end + + def create + @work = Work.new(work_params) + end + + def edit + @work = Work.find(params[:id]) + end + + def update + @work = Work.find(params[:id]) + + if @work.update(work_params) + + category = params[:category] + if category == "movie" + redirect_to movies_path + elsif category == "book" + redirect_to books_path + else # category == "album" + redirect_to albums_path + end + + else + render "edit" + end + end + + def destroy + Trip.destroy(params[:id]) + + category = params[:category] + if category == "movie" + redirect_to movies_path + elsif category == "book" + redirect_to books_path + else # category == "album" + redirect_to albums_path + end + + end + + + private + + def work_params + params.require(:work).permit(:category, :title, :creator, :description, :publication_year) + end end diff --git a/app/models/work.rb b/app/models/work.rb index 83ee9ad4e2..a00a053b7c 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -3,5 +3,28 @@ class Work < ApplicationRecord validates :category, presence: true, inclusion: { in: %w(movie book album), message: "%{value} is not a valid category" }, allow_nil: false - validates :title, presence: true -end + validates :title, presence: true + + # returns the first work object with the most votes: class method + def self.spotlight + works = Work.all + max_vote = 0 + spotlight_work = nil + works.each do |work| + vote_count = work.votes.size + if vote_count > max_vote + max_vote = vote_count + spotlight_work = work + end + end + + if spotlight_work == nil + return Work.all.sample + else + return spotlight_work + end + end + + + + end From 191dbbb6da6d9442e6af5e65154e96e3676b3fe5 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 16:52:08 -0700 Subject: [PATCH 12/50] added seed file --- db/seeds.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..7ff66bbae9 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,23 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +require "csv" + +# seeding for Works aka media +works = [] + +CSV.foreach("db/media_seeds.csv", { :headers => true }) do |line| +works << { category: line[0], title: line[1], creator: line[2], publication_year: line[3], description: line[4] } +end +success_count = 0 + +works.each do |work| + temp_work = Work.create(work) + if temp_work.id + success_count += 1 + puts "#{temp_work.title} successfully added. Category: #{temp_work.category}" + end +end + +puts "#{success_count} out of #{works.length} successfully added" From 11b242e3193f17c13b149c0d67b32d2dbe924aa2 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Tue, 11 Apr 2017 16:55:24 -0700 Subject: [PATCH 13/50] Controllers added for the albums, books, and movies categories --- app/controllers/albums_controller.rb | 2 ++ app/controllers/books_controller.rb | 2 ++ app/controllers/movies_controller.rb | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 app/controllers/albums_controller.rb create mode 100644 app/controllers/books_controller.rb create mode 100644 app/controllers/movies_controller.rb diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb new file mode 100644 index 0000000000..2f800bd33f --- /dev/null +++ b/app/controllers/albums_controller.rb @@ -0,0 +1,2 @@ +class AlbumsController < ApplicationController +end diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb new file mode 100644 index 0000000000..cdb437b99f --- /dev/null +++ b/app/controllers/books_controller.rb @@ -0,0 +1,2 @@ +class BooksController < ApplicationController +end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb new file mode 100644 index 0000000000..6c4c516140 --- /dev/null +++ b/app/controllers/movies_controller.rb @@ -0,0 +1,2 @@ +class MoviesController < ApplicationController +end From 48e40a2a462a88ce44ec4d71ba5daa8cbea682d2 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 12 Apr 2017 09:13:19 -0700 Subject: [PATCH 14/50] home page view added --- app/views/works/index.html.erb | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/views/works/index.html.erb diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb new file mode 100644 index 0000000000..36a9e94570 --- /dev/null +++ b/app/views/works/index.html.erb @@ -0,0 +1,48 @@ +
+

Media Spotlight: <%= link_to @spotlight_work.title, work_path(@spotlight_work.id) %> by <%= @spotlight_work.creator %> +

+ <%= @spotlight_work.votes.size %> votes + <% if @spotlight_work.description != nil %> + <%= "- #{@spotlight_work.description}" %> + <% end %> +

+

+ +
+

Top Movies

+
    + <% @movies.each do |movie| %> +
  • +

    <%= link_to movie.title, work_path(movie.id) %> by <%= movie.creator %>

    +

    <%= movie.votes.size %> votes

    +
  • + <% end %> +
+

<%= link_to "See More Movies", movies_path %>

+
+ +
+

Top Books

+
    + <% @books.each do |book| %> +
  • +

    <%= link_to book.title, work_path(book.id) %> by <%= book.creator %>

    +

    <%= book.votes.size %> votes

    +
  • + <% end %> +
+

<%= link_to "See More Books", movies_path %>

+
+ +
+

Top Albums

+
    + <% @albums.each do |album| %> +
  • +

    <%= link_to album.title, work_path(album.id) %> by <%= album.creator %>

    +

    <%= album.votes.size %> votes

    +
  • + <% end %> +
+

<%= link_to "See More Albums", movies_path %>

+
From 6bbacab76fb54820b26910a9f941dbef3ade35fe Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 12 Apr 2017 22:15:35 -0700 Subject: [PATCH 15/50] Created seperate controller for root path, homes#index instead of using works#index --- app/assets/javascripts/homes.coffee | 3 ++ app/assets/stylesheets/homes.scss | 3 ++ app/controllers/homes_controller.rb | 8 ++++ app/helpers/homes_helper.rb | 2 + app/views/homes/index.html.erb | 48 +++++++++++++++++++++++ test/controllers/homes_controller_test.rb | 9 +++++ 6 files changed, 73 insertions(+) create mode 100644 app/assets/javascripts/homes.coffee create mode 100644 app/assets/stylesheets/homes.scss create mode 100644 app/controllers/homes_controller.rb create mode 100644 app/helpers/homes_helper.rb create mode 100644 app/views/homes/index.html.erb create mode 100644 test/controllers/homes_controller_test.rb diff --git a/app/assets/javascripts/homes.coffee b/app/assets/javascripts/homes.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/homes.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/homes.scss b/app/assets/stylesheets/homes.scss new file mode 100644 index 0000000000..06b5a4714a --- /dev/null +++ b/app/assets/stylesheets/homes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Homes 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/homes_controller.rb b/app/controllers/homes_controller.rb new file mode 100644 index 0000000000..546c55f8cc --- /dev/null +++ b/app/controllers/homes_controller.rb @@ -0,0 +1,8 @@ +class HomesController < ApplicationController + def index + @movies = Work.where(category: "movie") + @albums = Work.where(category: "album") + @books = Work.where(category: "book") + @spotlight_work = Work.spotlight + end +end diff --git a/app/helpers/homes_helper.rb b/app/helpers/homes_helper.rb new file mode 100644 index 0000000000..2a8ce49d58 --- /dev/null +++ b/app/helpers/homes_helper.rb @@ -0,0 +1,2 @@ +module HomesHelper +end diff --git a/app/views/homes/index.html.erb b/app/views/homes/index.html.erb new file mode 100644 index 0000000000..d8891a42eb --- /dev/null +++ b/app/views/homes/index.html.erb @@ -0,0 +1,48 @@ +
+

Media Spotlight: <%= link_to @spotlight_work.title, work_path(@spotlight_work.id) %> by <%= @spotlight_work.creator %> +

+ <%= @spotlight_work.votes.size %> votes + <% if @spotlight_work.description != nil %> + <%= "- #{@spotlight_work.description}" %> + <% end %> +

+

+ +
+

Top Movies

+
    + <% @movies[0..9].each do |movie| %> +
  • +

    <%= link_to movie.title, work_path(movie.id) %> by <%= movie.creator %>

    +

    <%= movie.votes.size %> votes

    +
  • + <% end %> +
+ <%= link_to "See More Movies", movies_path %> +
+ +
+

Top Books

+
    + <% @books[0..9].each do |book| %> +
  • +

    <%= link_to book.title, work_path(book.id) %> by <%= book.creator %>

    +

    <%= book.votes.size %> votes

    +
  • + <% end %> +
+ <%= link_to "See More Books", books_path %> +
+ +
+

Top Albums

+
    + <% @albums[0..9].each do |album| %> +
  • +

    <%= link_to album.title, work_path(album.id) %> by <%= album.creator %>

    +

    <%= album.votes.size %> votes

    +
  • + <% end %> +
+ <%= link_to "See More Albums", albums_path %> +
diff --git a/test/controllers/homes_controller_test.rb b/test/controllers/homes_controller_test.rb new file mode 100644 index 0000000000..ddbcbbb6b4 --- /dev/null +++ b/test/controllers/homes_controller_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe HomesController do + it "should get index" do + get homes_index_url + value(response).must_be :success? + end + +end From da3fc9f37aea9510195fb79f6f25c4b8dedde8f3 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 12 Apr 2017 22:38:29 -0700 Subject: [PATCH 16/50] add controllers for each media --- app/controllers/albums_controller.rb | 10 +++++++++- app/controllers/books_controller.rb | 6 +++++- app/controllers/movies_controller.rb | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index 2f800bd33f..618336557b 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -1,2 +1,10 @@ -class AlbumsController < ApplicationController +class AlbumsController < WorksController + + def index + @albums = Work.where(category: "album") + end + + def new + @work = Work.new(category: "album") + end end diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb index cdb437b99f..705c86ab17 100644 --- a/app/controllers/books_controller.rb +++ b/app/controllers/books_controller.rb @@ -1,2 +1,6 @@ -class BooksController < ApplicationController +class BooksController < WorksController + def index + @books = Work.where(category:"book") + end + end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 6c4c516140..08a62eeda2 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,2 +1,5 @@ -class MoviesController < ApplicationController +class MoviesController < WorksController + def index + @movies = Work.where(category:"movie") + end end From 1eace226d59741783b03e1b5e64de46419bc077f Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Wed, 12 Apr 2017 22:49:13 -0700 Subject: [PATCH 17/50] add views for each media category --- app/assets/javascripts/albums.coffee | 3 +++ app/assets/javascripts/books.coffee | 3 +++ app/assets/javascripts/movies.coffee | 3 +++ app/assets/stylesheets/albums.scss | 3 +++ app/assets/stylesheets/books.scss | 3 +++ app/assets/stylesheets/movies.scss | 3 +++ app/helpers/albums_helper.rb | 2 ++ app/helpers/books_helper.rb | 2 ++ app/helpers/movies_helper.rb | 2 ++ app/views/albums/index.html.erb | 27 ++++++++++++++++++++++ app/views/albums/new.html.erb | 3 +++ app/views/books/index.html.erb | 27 ++++++++++++++++++++++ app/views/movies/index.html.erb | 27 ++++++++++++++++++++++ test/controllers/albums_controller_test.rb | 7 ++++++ test/controllers/books_controller_test.rb | 7 ++++++ test/controllers/movies_controller_test.rb | 7 ++++++ 16 files changed, 129 insertions(+) create mode 100644 app/assets/javascripts/albums.coffee create mode 100644 app/assets/javascripts/books.coffee create mode 100644 app/assets/javascripts/movies.coffee create mode 100644 app/assets/stylesheets/albums.scss create mode 100644 app/assets/stylesheets/books.scss create mode 100644 app/assets/stylesheets/movies.scss create mode 100644 app/helpers/albums_helper.rb create mode 100644 app/helpers/books_helper.rb create mode 100644 app/helpers/movies_helper.rb create mode 100644 app/views/albums/index.html.erb create mode 100644 app/views/albums/new.html.erb create mode 100644 app/views/books/index.html.erb create mode 100644 app/views/movies/index.html.erb create mode 100644 test/controllers/albums_controller_test.rb create mode 100644 test/controllers/books_controller_test.rb create mode 100644 test/controllers/movies_controller_test.rb diff --git a/app/assets/javascripts/albums.coffee b/app/assets/javascripts/albums.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/albums.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/books.coffee b/app/assets/javascripts/books.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/books.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/movies.coffee b/app/assets/javascripts/movies.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/movies.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/albums.scss b/app/assets/stylesheets/albums.scss new file mode 100644 index 0000000000..684cc4c17f --- /dev/null +++ b/app/assets/stylesheets/albums.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Albums 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/books.scss b/app/assets/stylesheets/books.scss new file mode 100644 index 0000000000..9fab565c8d --- /dev/null +++ b/app/assets/stylesheets/books.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Books 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/movies.scss b/app/assets/stylesheets/movies.scss new file mode 100644 index 0000000000..b86dfedb53 --- /dev/null +++ b/app/assets/stylesheets/movies.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Movies controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/helpers/albums_helper.rb b/app/helpers/albums_helper.rb new file mode 100644 index 0000000000..d976b7cef8 --- /dev/null +++ b/app/helpers/albums_helper.rb @@ -0,0 +1,2 @@ +module AlbumsHelper +end diff --git a/app/helpers/books_helper.rb b/app/helpers/books_helper.rb new file mode 100644 index 0000000000..4b9311e0be --- /dev/null +++ b/app/helpers/books_helper.rb @@ -0,0 +1,2 @@ +module BooksHelper +end diff --git a/app/helpers/movies_helper.rb b/app/helpers/movies_helper.rb new file mode 100644 index 0000000000..493eee555f --- /dev/null +++ b/app/helpers/movies_helper.rb @@ -0,0 +1,2 @@ +module MoviesHelper +end diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb new file mode 100644 index 0000000000..3292e94de5 --- /dev/null +++ b/app/views/albums/index.html.erb @@ -0,0 +1,27 @@ +

List of Albums

+
+ + + + + + + + + + + + <% @albums.each do |album| %> + + + + + + + + <% end %> + +
VotesTitleCreated ByPublishedUpvote
<%= album.votes.size %><%= link_to album.title, work_path(album.id) %><%= album.creator %><%= album.publication_year %><%= link_to "Upvote", upvote_path(album.id)%>
+ <%= link_to "View all media", root_path %> + <%= link_to "Add a new album", new_album_path %> +
diff --git a/app/views/albums/new.html.erb b/app/views/albums/new.html.erb new file mode 100644 index 0000000000..3b62c0d958 --- /dev/null +++ b/app/views/albums/new.html.erb @@ -0,0 +1,3 @@ +

Add a new album

+ +<%= render partial: "form_new_work", locals: { form_method: :post } %> diff --git a/app/views/books/index.html.erb b/app/views/books/index.html.erb new file mode 100644 index 0000000000..303d8e5ecd --- /dev/null +++ b/app/views/books/index.html.erb @@ -0,0 +1,27 @@ +

List of Movies

+
+ + + + + + + + + + + + <% @books.each do |book| %> + + + + + + + + <% end %> + +
VotesTitleCreated ByPublishedUpvote
<%= book.votes.size %><%= link_to book.title, work_path(book.id) %><%= book.creator %><%= book.publication_year %><%= link_to "Upvote", upvote_path(book.id)%>
+ <%= link_to "View all media", root_path %> + <%= link_to "Add a new book", new_book_path %> +
diff --git a/app/views/movies/index.html.erb b/app/views/movies/index.html.erb new file mode 100644 index 0000000000..35a7186db4 --- /dev/null +++ b/app/views/movies/index.html.erb @@ -0,0 +1,27 @@ +

List of Movies

+
+ + + + + + + + + + + + <% @movies.each do |movie| %> + + + + + + + + <% end %> + +
VotesTitleCreated ByPublishedUpvote
<%= movie.votes.size %><%= link_to movie.title, work_path(movie.id) %><%= movie.creator %><%= movie.publication_year %><%= link_to "Upvote", upvote_path(movie.id)%>
+ <%= link_to "View all media", root_path %> + <%= link_to "Add a new movie", new_movie_path %> +
diff --git a/test/controllers/albums_controller_test.rb b/test/controllers/albums_controller_test.rb new file mode 100644 index 0000000000..df16340489 --- /dev/null +++ b/test/controllers/albums_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe AlbumsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/books_controller_test.rb b/test/controllers/books_controller_test.rb new file mode 100644 index 0000000000..7e675c8f26 --- /dev/null +++ b/test/controllers/books_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe BooksController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb new file mode 100644 index 0000000000..67fabbcfba --- /dev/null +++ b/test/controllers/movies_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MoviesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From ccbd5cc9cd8b50c10e21df12a12a1dfd80b2f3ef Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Thu, 13 Apr 2017 09:05:54 -0700 Subject: [PATCH 18/50] add controller test for works --- app/controllers/application_controller.rb | 4 ++ app/controllers/works_controller.rb | 47 +++++++------ test/controllers/works_controller_test.rb | 80 ++++++++++++++++++++++- 3 files changed, 107 insertions(+), 24 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694e9d..a1376e0f7d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + def render_404 + render file: "#{ Rails.root }/public/404.html", status: 404 + end + end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 339aa1e80c..71634e96d8 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,15 +1,9 @@ class WorksController < ApplicationController - def index - @works = Work.all - @spotlight_work = Work.spotlight - end - def show - @result_work = Work.find(params[:id]) - end - - def create - @work = Work.new(work_params) + @result_work = Work.find_by_id(params[:id]) + if !@result_work + render_404 + end end def edit @@ -18,27 +12,40 @@ def edit def update @work = Work.find(params[:id]) - if @work.update(work_params) - - category = params[:category] - if category == "movie" + if @work.category == "movie" redirect_to movies_path - elsif category == "book" + elsif @work.category == "book" redirect_to books_path - else # category == "album" + else redirect_to albums_path end - else render "edit" end end - def destroy - Trip.destroy(params[:id]) + def create + @work = Work.create(work_params) + if @work.id != nil + flash[:success] = "#{@work.category} added successfully" + if @work.category == "movie" + redirect_to movies_path + elsif @work.category == "book" + redirect_to books_path + else + redirect_to albums_path + end + else + flash.now[:error] = "Error has occured" + render "new" + end + end + def destroy category = params[:category] + Work.destroy(params[:id]) + if category == "movie" redirect_to movies_path elsif category == "book" @@ -46,10 +53,8 @@ def destroy else # category == "album" redirect_to albums_path end - end - private def work_params diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index d95073c22e..f11973dd8a 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -1,7 +1,81 @@ require "test_helper" describe WorksController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "WorksControllerTest" do + it "should get show" do + get work_path(works(:lee).id) + must_respond_with :success + end + + it "should show a 404 when work is not found" do + get work_path(0) + must_respond_with :missing + end + + it "should redirect to book list after creating a book" do + post works_path, params: { work: + { category: "book", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah", + } + } + must_redirect_to books_path + end + + it "should redirect to album list after creating an album" do + post works_path, params: { work: + { category: "album", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah", + } + } + must_redirect_to albums_path + end + + it "should redirect to movie list after creating a movie" do + post works_path, params: { work: + { category: "movie", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah", + } + } + must_redirect_to movies_path + end + + it "should affect the model when creating a work" do + proc { + post works_path, params: { work: + { category: "book", + title: "Testing book", + creator: "someone", + publication_year: "4444", + description: "blah blah", + } + } + }.must_change 'Work.count', 1 + end + + it "delete an album and redirects to album list" do + delete work_path(works(:lee).id) + must_redirect_to albums_path + end + + it "should affect the model when deleting a work " do + proc { + delete work_path(works(:lee).id) + }.must_change 'Work.count', -1 + end + + it "should get edit page" do + get edit_work_path(works(:lee).id) + must_respond_with :success + end + + end end From ab1b9bca5e188109b30f16a99222883de41b18e2 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Thu, 13 Apr 2017 09:11:01 -0700 Subject: [PATCH 19/50] deleted works#index and update routes for root_path --- app/models/work.rb | 3 --- app/views/works/index.html.erb | 48 ---------------------------------- config/routes.rb | 11 ++++++++ 3 files changed, 11 insertions(+), 51 deletions(-) delete mode 100644 app/views/works/index.html.erb diff --git a/app/models/work.rb b/app/models/work.rb index a00a053b7c..3ec1e22f3a 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -24,7 +24,4 @@ def self.spotlight return spotlight_work end end - - - end diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb deleted file mode 100644 index 36a9e94570..0000000000 --- a/app/views/works/index.html.erb +++ /dev/null @@ -1,48 +0,0 @@ -
-

Media Spotlight: <%= link_to @spotlight_work.title, work_path(@spotlight_work.id) %> by <%= @spotlight_work.creator %> -

- <%= @spotlight_work.votes.size %> votes - <% if @spotlight_work.description != nil %> - <%= "- #{@spotlight_work.description}" %> - <% end %> -

-

- -
-

Top Movies

-
    - <% @movies.each do |movie| %> -
  • -

    <%= link_to movie.title, work_path(movie.id) %> by <%= movie.creator %>

    -

    <%= movie.votes.size %> votes

    -
  • - <% end %> -
-

<%= link_to "See More Movies", movies_path %>

-
- -
-

Top Books

-
    - <% @books.each do |book| %> -
  • -

    <%= link_to book.title, work_path(book.id) %> by <%= book.creator %>

    -

    <%= book.votes.size %> votes

    -
  • - <% end %> -
-

<%= link_to "See More Books", movies_path %>

-
- -
-

Top Albums

-
    - <% @albums.each do |album| %> -
  • -

    <%= link_to album.title, work_path(album.id) %> by <%= album.creator %>

    -

    <%= album.votes.size %> votes

    -
  • - <% end %> -
-

<%= link_to "See More Albums", movies_path %>

-
diff --git a/config/routes.rb b/config/routes.rb index 787824f888..1e539cb307 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,14 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + root 'homes#index' + post '/works/:id/upvote', to: "votes#create", as: 'upvote' + + resources :works, except: [:new] + resources :movies, except: [:destroy, :create, :show, :edit, :update] + resources :albums, except: [:destroy, :create, :show, :edit, :update] + resources :books, except: [:destroy, :create, :show, :edit, :update] + + resources :users, except: [:destroy, :edit, :update] + resources :votes, except: [:new, :destroy, :edit, :update, :index] + end From 86b1a2e56a042d70080568b2a1c9ae9b2a5e9735 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Thu, 13 Apr 2017 09:13:50 -0700 Subject: [PATCH 20/50] update works controller tesrt and yml test data --- test/controllers/works_controller_test.rb | 193 +++++++++++++++------- test/fixtures/works.yml | 8 + 2 files changed, 140 insertions(+), 61 deletions(-) diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index f11973dd8a..e977551532 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -2,80 +2,151 @@ describe WorksController do describe "WorksControllerTest" do - it "should get show" do - get work_path(works(:lee).id) - must_respond_with :success - end + it "should get show" do + get work_path(works(:lee).id) + must_respond_with :success + end - it "should show a 404 when work is not found" do - get work_path(0) - must_respond_with :missing - end + it "should show a 404 when work is not found" do + get work_path(0) + must_respond_with :missing + end - it "should redirect to book list after creating a book" do - post works_path, params: { work: - { category: "book", - title: "Testing", - creator: "someone", - publication_year: "4444", - description: "blah blah", - } + it "should get edit page" do + get edit_work_path(works(:lee).id) + must_respond_with :success + end + + it "should update a book" do + put work_path(works(:lee).id), params: {work: + { category: "book", + title: "Testing Update", + creator: "Lee", + publication_year: "4444", + description: "blah blah" } - must_redirect_to books_path - end + } - it "should redirect to album list after creating an album" do - post works_path, params: { work: - { category: "album", - title: "Testing", - creator: "someone", - publication_year: "4444", - description: "blah blah", - } + work = Work.find_by_id(works(:lee).id) + + work.category.must_equal "book" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "4444" + work.description.must_equal "blah blah" + + must_respond_with :redirect + must_redirect_to books_path + end + + it "should update an album" do + put work_path(works(:dan).id), params: {work: + { category: "album", + title: "Testing Update", + creator: "Lee", + publication_year: "5555", + description: "blah blah" + } + } + + work = Work.find_by_id(works(:dan).id) + + work.category.must_equal "album" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "5555" + work.description.must_equal "blah blah" + + must_respond_with :redirect + must_redirect_to albums_path + end + + it "should update movie" do + put work_path(works(:mee).id), params: {work: + { category: "movie", + title: "Testing Update", + creator: "Lee", + publication_year: "6666", + description: "blah blah" + } + } + + work = Work.find_by_id(works(:mee).id) + + work.category.must_equal "movie" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "6666" + work.description.must_equal "blah blah" + + must_respond_with :redirect + must_redirect_to movies_path + end + + + it "should create a book" do + post works_path, params: { work: + { category: "book", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" + } + } + + must_respond_with :redirect + must_redirect_to books_path + end + + it "should create an album" do + post works_path, params: { work: + { category: "album", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" + } + } + must_respond_with :redirect + must_redirect_to albums_path + end + + it "should create a movie" do + post works_path, params: { work: + { category: "movie", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" } - must_redirect_to albums_path - end + } + must_respond_with :redirect + must_redirect_to movies_path + end - it "should redirect to movie list after creating a movie" do + it "should affect the model when creating a work" do + proc { post works_path, params: { work: - { category: "movie", - title: "Testing", + { category: "book", + title: "Testing book", creator: "someone", publication_year: "4444", - description: "blah blah", + description: "blah blah" } } - must_redirect_to movies_path - end - - it "should affect the model when creating a work" do - proc { - post works_path, params: { work: - { category: "book", - title: "Testing book", - creator: "someone", - publication_year: "4444", - description: "blah blah", - } - } - }.must_change 'Work.count', 1 - end + }.must_change 'Work.count', 1 + end - it "delete an album and redirects to album list" do + it "should affect the model when deleting a work " do + proc { delete work_path(works(:lee).id) - must_redirect_to albums_path - end - - it "should affect the model when deleting a work " do - proc { - delete work_path(works(:lee).id) - }.must_change 'Work.count', -1 - end - - it "should get edit page" do - get edit_work_path(works(:lee).id) - must_respond_with :success - end + }.must_change 'Work.count', -1 + end + it "delete an album and redirects to album list" do + delete work_path(works(:lee).id) + must_respond_with :redirect + must_redirect_to albums_path end + end end diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index a162eda5a3..a6acfa59b2 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -9,6 +9,14 @@ lee: publication_year: 2016 description: Good book that came before the movie +# work with complete data +mee: + category: movie + title: Hidden Figures + creator: Margot Lee Shetterly + publication_year: 2016 + description: Good movie that came after the book + # work without description dan: category: album From 03169dbfb6ec90c8cbdc4286e1cb03e51427b5ee Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Thu, 13 Apr 2017 09:14:24 -0700 Subject: [PATCH 21/50] add homes controller test --- test/controllers/homes_controller_test.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/controllers/homes_controller_test.rb b/test/controllers/homes_controller_test.rb index ddbcbbb6b4..98cf96497c 100644 --- a/test/controllers/homes_controller_test.rb +++ b/test/controllers/homes_controller_test.rb @@ -1,9 +1,10 @@ require "test_helper" describe HomesController do - it "should get index" do - get homes_index_url - value(response).must_be :success? + describe "BooksControllerTest" do + it "should get index" do + get root_path + must_respond_with :success + end end - end From c7aa77476071828c82db71ffd71cfa4a46374dcd Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 10:32:35 -0700 Subject: [PATCH 22/50] Tests for work and each media categories added --- test/controllers/albums_controller_test.rb | 12 +++++++++--- test/controllers/books_controller_test.rb | 14 ++++++++++---- test/controllers/movies_controller_test.rb | 12 +++++++++--- test/controllers/works_controller_test.rb | 14 +++++++++++++- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/test/controllers/albums_controller_test.rb b/test/controllers/albums_controller_test.rb index df16340489..14a9326c19 100644 --- a/test/controllers/albums_controller_test.rb +++ b/test/controllers/albums_controller_test.rb @@ -1,7 +1,13 @@ require "test_helper" describe AlbumsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should get index" do + get albums_path + must_respond_with :success + end + + it "should get new form" do + get new_album_path + must_respond_with :success + end end diff --git a/test/controllers/books_controller_test.rb b/test/controllers/books_controller_test.rb index 7e675c8f26..32751e8192 100644 --- a/test/controllers/books_controller_test.rb +++ b/test/controllers/books_controller_test.rb @@ -1,7 +1,13 @@ require "test_helper" -describe BooksController do - # it "must be a real test" do - # flunk "Need real tests" - # end +describe "BooksControllerTest" do + it "should get index" do + get books_path + must_respond_with :success + end + + it "should get new" do + get new_book_path + must_respond_with :success + end end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 67fabbcfba..9f83eba640 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -1,7 +1,13 @@ require "test_helper" describe MoviesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should get index" do + get movies_path + must_respond_with :success + end + + it "should get new form" do + get new_movie_path + must_respond_with :success + end end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index e977551532..75769e7721 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -144,9 +144,21 @@ end it "delete an album and redirects to album list" do - delete work_path(works(:lee).id) + delete work_path(works(:dan).id) must_respond_with :redirect must_redirect_to albums_path end + + it "delete a book and redirects to book list" do + delete work_path(works(:lee).id) + must_respond_with :redirect + must_redirect_to books_path + end + + it "delete an movie and redirects to movie list" do + delete work_path(works(:mee).id) + must_respond_with :redirect + must_redirect_to movies_path + end end end From 48f4518c98e075c201195dc081a4a2bc99d8352f Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 10:34:34 -0700 Subject: [PATCH 23/50] update controllers for works, movies, and books --- app/controllers/books_controller.rb | 3 +++ app/controllers/movies_controller.rb | 4 ++++ app/controllers/works_controller.rb | 17 ++++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb index 705c86ab17..82e67fffa0 100644 --- a/app/controllers/books_controller.rb +++ b/app/controllers/books_controller.rb @@ -3,4 +3,7 @@ def index @books = Work.where(category:"book") end + def new + @work = Work.new(category: "book") + end end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 08a62eeda2..3aaea89c3f 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -2,4 +2,8 @@ class MoviesController < WorksController def index @movies = Work.where(category:"movie") end + + def new + @work = Work.new(category: "movie") + end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 71634e96d8..2ad66d7f5a 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -7,11 +7,11 @@ def show end def edit - @work = Work.find(params[:id]) + @work = Work.find_by_id(params[:id]) end def update - @work = Work.find(params[:id]) + @work = Work.find_by_id(params[:id]) if @work.update(work_params) if @work.category == "movie" redirect_to movies_path @@ -38,19 +38,26 @@ def create end else flash.now[:error] = "Error has occured" - render "new" + if @work.category == "movie" + render "movies/new" + elsif @work.category == "book" + render "books/new" + else + render "albums/new" + end end end def destroy - category = params[:category] + work = Work.find_by_id(params[:id]) + category = work.category Work.destroy(params[:id]) if category == "movie" redirect_to movies_path elsif category == "book" redirect_to books_path - else # category == "album" + else redirect_to albums_path end end From 6e3493bb82a8e78205f7e5e193df7c91f74f3065 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 10:37:29 -0700 Subject: [PATCH 24/50] Update routes and indexview for each media category --- app/views/albums/index.html.erb | 4 ++-- app/views/books/index.html.erb | 6 +++--- app/views/movies/index.html.erb | 4 ++-- config/routes.rb | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb index 3292e94de5..426f1209fc 100644 --- a/app/views/albums/index.html.erb +++ b/app/views/albums/index.html.erb @@ -16,8 +16,8 @@ <%= album.votes.size %> <%= link_to album.title, work_path(album.id) %> <%= album.creator %> - <%= album.publication_year %> - <%= link_to "Upvote", upvote_path(album.id)%> + <%= album.publication_year.to_i %> + <%= "Upvote"%> <% end %> diff --git a/app/views/books/index.html.erb b/app/views/books/index.html.erb index 303d8e5ecd..a85a230b06 100644 --- a/app/views/books/index.html.erb +++ b/app/views/books/index.html.erb @@ -1,4 +1,4 @@ -

List of Movies

+

List of Books

@@ -16,8 +16,8 @@ - - + + <% end %> diff --git a/app/views/movies/index.html.erb b/app/views/movies/index.html.erb index 35a7186db4..892a5c72a0 100644 --- a/app/views/movies/index.html.erb +++ b/app/views/movies/index.html.erb @@ -16,8 +16,8 @@ - - + + <% end %> diff --git a/config/routes.rb b/config/routes.rb index 1e539cb307..f70c207714 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,9 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'homes#index' - post '/works/:id/upvote', to: "votes#create", as: 'upvote' - resources :works, except: [:new] + resources :works, except: [:index, :new] + resources :movies, except: [:destroy, :create, :show, :edit, :update] resources :albums, except: [:destroy, :create, :show, :edit, :update] resources :books, except: [:destroy, :create, :show, :edit, :update] From 83633b5838e97cd152286399deaf801a92178e10 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 11:17:31 -0700 Subject: [PATCH 25/50] updated user controller test and added action methods to user controller --- app/controllers/users_controller.rb | 19 +++++++++++++++++++ test/fixtures/users.yml | 5 +---- test/models/user_test.rb | 26 +++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3e74dea87f..4f42e50598 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,2 +1,21 @@ class UsersController < ApplicationController + def index + @users = User.all + end + + def show + @result_user = User.find_by_id(params[:id]) + if !@result_user + render_404 + end + end + + def create + @work = Work.create(work_params) + end + + def work_params + params.require(:user).permit(:name) + end + end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 56066c68af..13f08edb21 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,7 +1,4 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString - -two: +user: name: MyString diff --git a/test/models/user_test.rb b/test/models/user_test.rb index cc862ac2d9..11af182c3c 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,9 +1,29 @@ require "test_helper" describe User do - let(:user) { User.new } + describe "validations" do + it "is invalid without a name" do + user = User.new + user.valid?.must_equal false + user.errors.messages.must_include :name + end - it "must be valid" do - value(user).must_be :valid? + it "is valid with a name" do + users(:user).valid?.must_equal true + end end + + describe "Entity Relationship" do + it "can access Vote objects" do + user = User.create(name: "ken") + work = works(:lee) + vote = Vote.create(user_id: user.id, work_id: work.id) + work_two = works(:mee) + vote_two= Vote.create(user_id: user.id, work_id: work_two.id) + + user.votes[0].class.must_equal Vote + user.votes.size.must_equal 2 + end + end + end From 5cec8dc04be402959daf27edf7e70bc1ae0504cf Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 11:29:12 -0700 Subject: [PATCH 26/50] added user show view pages, user controller tests, and updated routes --- app/controllers/users_controller.rb | 4 ++-- app/views/users/index.html.erb | 0 app/views/users/show.html.erb | 0 config/routes.rb | 2 +- test/controllers/users_controller_test.rb | 26 ++++++++++++++++++++--- 5 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 app/views/users/index.html.erb create mode 100644 app/views/users/show.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 4f42e50598..395ed7b576 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -11,10 +11,10 @@ def show end def create - @work = Work.create(work_params) + @work = User.create(user_params) end - def work_params + def user_params params.require(:user).permit(:name) end diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/routes.rb b/config/routes.rb index f70c207714..063057b1b7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,7 +8,7 @@ resources :albums, except: [:destroy, :create, :show, :edit, :update] resources :books, except: [:destroy, :create, :show, :edit, :update] - resources :users, except: [:destroy, :edit, :update] + resources :users, except: [:destroy, :edit, :update, :new] resources :votes, except: [:new, :destroy, :edit, :update, :index] end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 89decb54e0..5052b22b26 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,7 +1,27 @@ require "test_helper" describe UsersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should get index" do + get users_path + must_respond_with :success + end + + it "should get show" do + get user_path(users(:user).id) + must_respond_with :success + end + + it "should show a 404 when user is not found" do + get user_path(0) + must_respond_with :missing + end + + it "should affect the model when creating a user" do + proc { + post users_path, params: { user: + { name: "myname" + } + } + }.must_change 'User.count', 1 + end end From 41a644bbc82b49c856ffc3ff8afe094c881c6722 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 14:18:55 -0700 Subject: [PATCH 27/50] added Sessions controller and added login form and login/logout action --- app/assets/javascripts/sessions.coffee | 3 +++ app/assets/stylesheets/sessions.scss | 3 +++ app/controllers/sessions_controller.rb | 26 ++++++++++++++++++++ app/helpers/sessions_helper.rb | 2 ++ app/views/sessions/login_form.html.erb | 13 ++++++++++ test/controllers/sessions_controller_test.rb | 7 ++++++ 6 files changed, 54 insertions(+) create mode 100644 app/assets/javascripts/sessions.coffee 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 app/views/sessions/login_form.html.erb create mode 100644 test/controllers/sessions_controller_test.rb diff --git a/app/assets/javascripts/sessions.coffee b/app/assets/javascripts/sessions.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/app/assets/javascripts/sessions.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..ccb1ed25b2 --- /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..8a5bc807d9 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,26 @@ +class SessionsController < ApplicationController + def login_form; end + + def login + user = User.find_by_name(params[:name]) + + if user + session[:user_id] = user.id + flash[:success] = "Successfully logged in as existing user #{ user.name }" + redirect_to root_path + else + user = User.new + user.name = params[:name] + user.save + session[:user_id] = user.id + flash[:success] = "Successfully created new user #{ user.name } with ID #{ user.id }" + redirect_to root_path + end + end + + def logout + session.delete(:user_id) + flash[:success] = "Successfully logged out" + redirect_to root_path + 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/views/sessions/login_form.html.erb b/app/views/sessions/login_form.html.erb new file mode 100644 index 0000000000..06867e4556 --- /dev/null +++ b/app/views/sessions/login_form.html.erb @@ -0,0 +1,13 @@ +

Log In

+<%= form_tag login_path do %> +<%= label_tag "Username" %> +<%= text_field_tag "name" %> + +<%= submit_tag "Log In" %> +<% end %> + +
+

A note about logging in

+

There is no password field. In fact, there is no indication whatsoever that you are who you say you are. There's nothing special about users - username is just another work of data that the user entered and we have to keep track of.

+

We'll learn more about security and authentication in the next couple weeks. For now, don't worry about it beyond what you can see here.

+
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 From ec716865485d361a93c32522a812c15da1ddf68d Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Fri, 14 Apr 2017 14:31:12 -0700 Subject: [PATCH 28/50] Update all controllers to access user_name method from app controller --- app/controllers/albums_controller.rb | 2 ++ app/controllers/application_controller.rb | 3 ++ app/controllers/books_controller.rb | 2 ++ app/controllers/homes_controller.rb | 1 + app/controllers/movies_controller.rb | 2 ++ app/controllers/users_controller.rb | 3 ++ app/controllers/votes_controller.rb | 10 ++++++ app/controllers/works_controller.rb | 5 +++ app/views/layouts/application.html.erb | 41 ++++++++++++++++++----- 9 files changed, 60 insertions(+), 9 deletions(-) diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index 618336557b..1633b3a4f4 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -1,10 +1,12 @@ class AlbumsController < WorksController def index + user_name @albums = Work.where(category: "album") end def new + user_name @work = Work.new(category: "album") end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a1376e0f7d..a60c972643 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,4 +4,7 @@ def render_404 render file: "#{ Rails.root }/public/404.html", status: 404 end + def user_name + @user = User.find_by_id(session[:user_id]) + end end diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb index 82e67fffa0..4b5c2717cf 100644 --- a/app/controllers/books_controller.rb +++ b/app/controllers/books_controller.rb @@ -1,9 +1,11 @@ class BooksController < WorksController def index + user_name @books = Work.where(category:"book") end def new + user_name @work = Work.new(category: "book") end end diff --git a/app/controllers/homes_controller.rb b/app/controllers/homes_controller.rb index 546c55f8cc..ebec185bc1 100644 --- a/app/controllers/homes_controller.rb +++ b/app/controllers/homes_controller.rb @@ -1,5 +1,6 @@ class HomesController < ApplicationController def index + user_name @movies = Work.where(category: "movie") @albums = Work.where(category: "album") @books = Work.where(category: "book") diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 3aaea89c3f..8354a5cc9b 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,9 +1,11 @@ class MoviesController < WorksController def index + user_name @movies = Work.where(category:"movie") end def new + user_name @work = Work.new(category: "movie") end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 395ed7b576..ea99a2866a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,9 +1,11 @@ class UsersController < ApplicationController def index + user_name @users = User.all end def show + user_name @result_user = User.find_by_id(params[:id]) if !@result_user render_404 @@ -11,6 +13,7 @@ def show end def create + user_name @work = User.create(user_params) end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index ffdb2760e0..784b3c5ee3 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,2 +1,12 @@ class VotesController < ApplicationController + + def create + user_name + @vote = Vote.new + @vote.work_id = params[:vote[:work_id]] + @vote.user_id = params[:vote[:user_id]] + #session conditional to focre login to vote + flash[:sucess] = Successfully upvoted! + end + end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 2ad66d7f5a..98fadd904a 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,5 +1,6 @@ class WorksController < ApplicationController def show + user_name @result_work = Work.find_by_id(params[:id]) if !@result_work render_404 @@ -7,10 +8,12 @@ def show end def edit + user_name @work = Work.find_by_id(params[:id]) end def update + user_name @work = Work.find_by_id(params[:id]) if @work.update(work_params) if @work.category == "movie" @@ -26,6 +29,7 @@ def update end def create + user_name @work = Work.create(work_params) if @work.id != nil flash[:success] = "#{@work.category} added successfully" @@ -49,6 +53,7 @@ def create end def destroy + user_name work = Work.find_by_id(params[:id]) category = work.category Work.destroy(params[:id]) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6af511b830..86bd67a1ff 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,14 +1,37 @@ - - MediaRanker - <%= csrf_meta_tags %> + + MediaRanker + <%= csrf_meta_tags %> - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> - + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + - - <%= yield %> - + + + +
+ <% flash.each do |name, message| %> +
<%= message %>
+ <% end %> +
+ + <%= yield %> + From 069d947f6daa6ec330e4ec5863c5ae68574e3fe8 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 16:49:12 -0700 Subject: [PATCH 29/50] added votes controller test and updated test fixtures --- app/controllers/votes_controller.rb | 44 +++++++++++++++++++--- app/models/vote.rb | 5 ++- test/controllers/votes_controller_test.rb | 45 +++++++++++++++++++++-- test/fixtures/votes.yml | 28 +++++++++++--- 4 files changed, 106 insertions(+), 16 deletions(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 784b3c5ee3..a869c1f60c 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,12 +1,44 @@ class VotesController < ApplicationController - def create user_name - @vote = Vote.new - @vote.work_id = params[:vote[:work_id]] - @vote.user_id = params[:vote[:user_id]] - #session conditional to focre login to vote - flash[:sucess] = Successfully upvoted! + if !@user + flash[:failure] = "You must log in to do that" + else + @vote = Vote.new + @vote.work_id = params[:work_id] + @vote.user_id = @user.id + if @vote.save + flash[:success] = "Successfully upvoted!" + else + flash[:failure] = "Could not upvote" + flash[:error] = "user: has already voted for this work" + end + end + redirect_to work_path(params[:work_id]) end + def create_from_list + user_name + if !@user + flash[:failure] = "You must log in to do that" + else + @vote = Vote.new + @vote.work_id = params[:work_id] + @vote.user_id = @user.id + if @vote.save + flash[:success] = "Successfully upvoted!" + else + flash[:failure] = "Could not upvote" + flash[:error] = "user: has already voted for this work" + end + end + work = Work.find_by_id(params[:work_id]) + if work.category == "movie" + redirect_to movies_path + elsif work.category == "book" + redirect_to books_path + else + redirect_to albums_path + end + end end diff --git a/app/models/vote.rb b/app/models/vote.rb index 68bda1c814..19c408d81c 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -1,4 +1,7 @@ class Vote < ApplicationRecord - belongs_to :work + belongs_to :work, counter_cache: true belongs_to :user + + validates :user_id, uniqueness: { scope: :work_id, + message: "user: has already voted for this work" } end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb index cf4d03935f..432a684e8e 100644 --- a/test/controllers/votes_controller_test.rb +++ b/test/controllers/votes_controller_test.rb @@ -1,7 +1,46 @@ require "test_helper" describe VotesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should be able to vote while logged in" do + proc { + post login_path(name: "user") + post vote_path(works(:lee).id) + }.must_change 'Vote.all.count', 1 + end + + it "should not be able to vote when not logged in" do + proc { + post login_path(name: "") + post vote_path(works(:lee).id) + }.must_change 'Vote.all.count', 0 + end + + it "should not be able to vote on the same work multiple times" do + proc { + post login_path(name: "user") + post vote_path(works(:lee).id) + post vote_path(works(:lee).id) + }.must_change 'Vote.all.count', 1 + end + + it "should be able to vote for a movie" do + proc { + post login_path(name: "user") + post vote_path(works(:mee).id) + }.must_change 'Vote.all.count', 1 + end + + it "should be able to vote for a album" do + proc { + post login_path(name: "user") + post vote_path(works(:dan).id) + }.must_change 'Vote.all.count', 1 + end + + it "should be able to vote for a book" do + proc { + post login_path(name: "user") + post vote_path(works(:lee).id) + }.must_change 'Vote.all.count', 1 + end end diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index dc3ee79b5d..d4ef11a7d9 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -3,9 +3,25 @@ # 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 + +# VALID WORK DATA +# vote with complete data +one: + user: user + work: lee + +# END VALID DATA + +# INVALID DATA +# vote without work +two: + user: user + work: + + +# vote without user +three: + user: + work: lee + +# END INVALID WORK DATA From ad4087ce315ca0285024ed27a0a6dc2bc48bbfc3 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 16:51:41 -0700 Subject: [PATCH 30/50] added migration to update logic for vote to track unique user-work pair --- db/migrate/20170414225554_add_index_to_vote.rb | 5 +++++ db/migrate/20170415145143_add_votes_cache_to_work.rb | 9 +++++++++ 2 files changed, 14 insertions(+) create mode 100644 db/migrate/20170414225554_add_index_to_vote.rb create mode 100644 db/migrate/20170415145143_add_votes_cache_to_work.rb diff --git a/db/migrate/20170414225554_add_index_to_vote.rb b/db/migrate/20170414225554_add_index_to_vote.rb new file mode 100644 index 0000000000..68d9d1bb5c --- /dev/null +++ b/db/migrate/20170414225554_add_index_to_vote.rb @@ -0,0 +1,5 @@ +class AddIndexToVote < ActiveRecord::Migration[5.0] + def change + add_index :votes, [:work_id, :user_id], unique: true + end +end diff --git a/db/migrate/20170415145143_add_votes_cache_to_work.rb b/db/migrate/20170415145143_add_votes_cache_to_work.rb new file mode 100644 index 0000000000..45c7f03fa5 --- /dev/null +++ b/db/migrate/20170415145143_add_votes_cache_to_work.rb @@ -0,0 +1,9 @@ +class AddVotesCacheToWork < ActiveRecord::Migration[5.0] + def change + add_column :works , :votes_count , :integer , :default => 0 + Work.reset_column_information + Work.all.each do |work| + Work.update_counters work.id , :votes_count => work.votes.length + end + end + end From 8b03869782d07da3bfdc14b6df1126edada6f817 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:13:56 -0700 Subject: [PATCH 31/50] added vote model tests --- test/models/vote_test.rb | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb index fc15947bd3..711d0c2c00 100644 --- a/test/models/vote_test.rb +++ b/test/models/vote_test.rb @@ -1,9 +1,30 @@ require "test_helper" describe Vote do - let(:vote) { Vote.new } + describe "validations" do + it "is valid with a user and a work" do + votes(:one).valid?.must_equal true + end - it "must be valid" do - value(vote).must_be :valid? + it "is invalid without a user" do + vote = votes(:three) + vote.valid?.must_equal false + vote.errors.messages.must_include :user + end + + it "is invlaid without a work" do + vote = votes(:two) + vote.valid?.must_equal false + vote.errors.messages.must_include :work + end + end + + describe "Entity Relationship" do + it "can access User objects" do + vote = votes(:one) + users(:user).must_equal vote.user + works(:lee).must_equal vote.work + end end + end From b8dfa3c9e6595cba26ad7afc48dbc39d672e7a43 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:31:26 -0700 Subject: [PATCH 32/50] added user tests for model and controller, and updated fixtures --- app/models/user.rb | 2 +- test/controllers/users_controller_test.rb | 2 +- test/fixtures/users.yml | 5 ++++- test/models/user_test.rb | 11 +++-------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index c46e64fc03..f6713a0b7a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,4 @@ class User < ApplicationRecord has_many :votes - validates :name, presence: true + validates :name, presence: true, length: { minimum: 1, message: "username: can't be blank" } end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 5052b22b26..acc7ca8031 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -7,7 +7,7 @@ end it "should get show" do - get user_path(users(:user).id) + get user_path(users(:userone)) must_respond_with :success end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 13f08edb21..ab7f143114 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,4 +1,7 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html user: - name: MyString + name: john doe + +userone: + name: jane doe diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 11af182c3c..73f9166d14 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -15,15 +15,10 @@ describe "Entity Relationship" do it "can access Vote objects" do - user = User.create(name: "ken") - work = works(:lee) - vote = Vote.create(user_id: user.id, work_id: work.id) - work_two = works(:mee) - vote_two= Vote.create(user_id: user.id, work_id: work_two.id) - - user.votes[0].class.must_equal Vote - user.votes.size.must_equal 2 + vote = votes(:one) + vote.user.must_equal users(:user) end end + end From 9ff505c7e0f15bf9a3f2115dc442ed4e4b083870 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:36:34 -0700 Subject: [PATCH 33/50] added session tests for model and controller, and updated flash error message placement --- app/controllers/sessions_controller.rb | 22 +++++++----- app/views/layouts/application.html.erb | 23 ++++++------ app/views/sessions/login_form.html.erb | 2 +- test/controllers/sessions_controller_test.rb | 38 ++++++++++++++++++-- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 8a5bc807d9..b14f381a23 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -9,18 +9,22 @@ def login flash[:success] = "Successfully logged in as existing user #{ user.name }" redirect_to root_path else - user = User.new - user.name = params[:name] - user.save - session[:user_id] = user.id - flash[:success] = "Successfully created new user #{ user.name } with ID #{ user.id }" - redirect_to root_path + user = User.create(name: params[:name]) + if user.id != nil + session[:user_id] = user.id + flash[:success] = "Successfully created new user #{user.name} with ID #{user.id}" + redirect_to root_path + else + flash.now[:failure] = "Could not log in" + flash.now[:error] = "username: can't be blank" + render "login_form" + end end end def logout - session.delete(:user_id) - flash[:success] = "Successfully logged out" - redirect_to root_path + session.delete(:user_id) + flash[:success] = "Successfully logged out" + redirect_to root_path end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 86bd67a1ff..141f479d61 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,24 +14,21 @@ Media Ranker Ranking the Best of Everything -
<% unless session[:user_id] %> -

Not logged in

- <%= link_to "Log In", login_path, method: :get %> +

Not logged in

+ <%= link_to "Log In", login_path, method: :get, class:"button float-right" %> <% else %> -

logged in as <%= link_to @user.name, user_path(session[:user_id]) %>

- <%= link_to "Log Out", logout_path, method: :delete %> +

Logged in as <%= link_to @user.name, user_path(session[:user_id]) %>

+ <%= link_to "Log Out", logout_path, method: :delete, class:"button float-right" %> <% end %>
- -
- <% flash.each do |name, message| %> -
<%= message %>
- <% end %> -
- - <%= yield %> + <% flash.each do |error, message| %> +

<%= message %>

+ <% end %> +
+ <%= yield %> +
diff --git a/app/views/sessions/login_form.html.erb b/app/views/sessions/login_form.html.erb index 06867e4556..00ab5123cd 100644 --- a/app/views/sessions/login_form.html.erb +++ b/app/views/sessions/login_form.html.erb @@ -3,7 +3,7 @@ <%= label_tag "Username" %> <%= text_field_tag "name" %> -<%= submit_tag "Log In" %> +<%= submit_tag "Log In", class:"button" %> <% end %>
diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index c2632a720b..04e06fb14f 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,7 +1,39 @@ require "test_helper" describe SessionsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + it "should get login page" do + get login_path + must_respond_with :success + end + + it "should recognize existing users at login" do + user = users(:user) + post login_path(name:user.name) + must_respond_with :redirect + must_redirect_to root_path + end + + it "should recognize new users at login" do + post login_path(name:"ginny") + must_respond_with :redirect + must_redirect_to root_path + end + + it "should render login form for invalid name" do + post login_path(name:"") + must_respond_with :success + end + + it "cannot allow blank user name at login" do + proc { + post login_path("") + }.must_change 'User.count', 0 + end + + it "should allow user to logout" do + delete logout_path + must_respond_with :found + must_respond_with :redirect + must_redirect_to root_path + end end From d75b191e7a5c2435caae82b18cf54c6defd266c8 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:39:25 -0700 Subject: [PATCH 34/50] update controllers to pass the tests --- app/assets/stylesheets/application.css | 91 ++++++++++++++++++++++---- app/controllers/homes_controller.rb | 6 +- app/controllers/users_controller.rb | 3 +- 3 files changed, 81 insertions(+), 19 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 0ebd7fe829..69d0634002 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,15 +1,78 @@ /* - * 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, vendor/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 - */ +* 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, vendor/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 +*/ +@import url('foundation.css'); + +.error, .failure { + color: red; +} + +.error { + font-size: 0.5em; +} + +.success { + color: green; +} + +p{ + margin-bottom: qrem; +} + +div p { + text-align: right; + font-size: .5em; + margin-bottom: 5px; +} +.page-header { + background-image: url("owl.jpg"); + background-repeat: no-repeat; + border-bottom: solid 1px darkgrey; + max-width: 100%; + margin-bottom: 10px; + margin-right: auto; + margin-left: auto; + display: block; +} + +.page-header h2 { + padding-left: 150px; + width: 75% + +} + +body small { + color: slategrey; +} + +article, aside, footer, header, nav, section, div { + display: block; +} + +.spotlight { + padding: 2rem; +} + +.spotlight * { + text-align: left; +} + +li { + list-style-type: none; +} + +ul { + margin: 0; +} diff --git a/app/controllers/homes_controller.rb b/app/controllers/homes_controller.rb index ebec185bc1..bbe441ae43 100644 --- a/app/controllers/homes_controller.rb +++ b/app/controllers/homes_controller.rb @@ -1,9 +1,9 @@ class HomesController < ApplicationController def index user_name - @movies = Work.where(category: "movie") - @albums = Work.where(category: "album") - @books = Work.where(category: "book") + @movies = Work.where(category: "movie").order(votes_count: :desc) + @albums = Work.where(category: "album").order(votes_count: :desc) + @books = Work.where(category: "book").order(votes_count: :desc) @spotlight_work = Work.spotlight end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ea99a2866a..3274420d5d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -14,11 +14,10 @@ def show def create user_name - @work = User.create(user_params) + @user = User.create(user_params) end def user_params params.require(:user).permit(:name) end - end From 8e3500de174c813b57528040c7470ac6fcbf4412 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:45:16 -0700 Subject: [PATCH 35/50] add html and foundation css to work view files --- app/views/works/_form_new_work.html.erb | 10 +++++++ app/views/works/_form_work.html.erb | 10 +++++++ app/views/works/edit.html.erb | 3 ++ app/views/works/show.html.erb | 37 +++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 app/views/works/_form_new_work.html.erb create mode 100644 app/views/works/_form_work.html.erb create mode 100644 app/views/works/edit.html.erb create mode 100644 app/views/works/show.html.erb diff --git a/app/views/works/_form_new_work.html.erb b/app/views/works/_form_new_work.html.erb new file mode 100644 index 0000000000..7c618f55ce --- /dev/null +++ b/app/views/works/_form_new_work.html.erb @@ -0,0 +1,10 @@ +
    + <%= form_for @work, method: form_method do |f| %> + <%= f.hidden_field :category, :value => @work.category %> +
  • <%= f.label :title %> <%= f.text_field :title %>
  • +
  • <%= f.label :creator %> <%= f.text_field :creator %>
  • +
  • <%= f.label :publication_year %> <%= f.text_field :publication_year %>
  • +
  • <%= f.label :description %> <%= f.text_field :description %>
  • +
  • <%= f.submit "Add #{@work.category.capitalize}", class:"button" %>
  • + <% end %> +
diff --git a/app/views/works/_form_work.html.erb b/app/views/works/_form_work.html.erb new file mode 100644 index 0000000000..efd191fb61 --- /dev/null +++ b/app/views/works/_form_work.html.erb @@ -0,0 +1,10 @@ +
    + <%= form_for @work, method: form_method do |f| %> + <%= f.hidden_field :category, :value => @work.category %> +
  • <%= f.label :title %> <%= f.text_field :title %>
  • +
  • <%= f.label :creator %> <%= f.text_field :creator %>
  • +
  • <%= f.label :publication_year %> <%= f.text_field :publication_year %>
  • +
  • <%= f.label :description %> <%= f.text_field :description %>
  • +
  • <%= f.submit "Update #{@work.category.capitalize}", class:"button" %>
  • + <% end %> +
diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb new file mode 100644 index 0000000000..063d23f30c --- /dev/null +++ b/app/views/works/edit.html.erb @@ -0,0 +1,3 @@ +

Edit this <%= @work.category %>

+ +<%= render partial: "form_work", locals: { form_method: :patch } %> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb new file mode 100644 index 0000000000..dfcbbaab79 --- /dev/null +++ b/app/views/works/show.html.erb @@ -0,0 +1,37 @@ +
+

<%= @result_work.title %>

+

Created by: <%= @result_work.creator %>

+

published: <%= @result_work.publication_year.to_i %>

+

<%= @result_work.description %>

+
+ <% if @result_work.category == "book" %> + <%= link_to "Back to book list", books_path, class:"button" %> + <% elsif @result_work.category == "album"%> + <%= link_to "Back to album list", albums_path, class:"button" %> + <% else %> + <%= link_to "Back to movies list", movies_path, class:"button" %> + <% end %> + <%= link_to "Edit", edit_work_path(@result_work.id), class:"button" %> + <%= link_to "Upvote", vote_path(@result_work.id), method: :post , class:"button"%> + <%= link_to "Delete", work_path(@result_work.id), data: { confirm: "Are you sure?" }, method: :delete, class:"button alert" %> +
+
+
+

<%= pluralize(@result_work.votes.size, "Vote") %> for this <%= @result_work.category.capitalize %>

+
<%= book.votes.size %> <%= link_to book.title, work_path(book.id) %> <%= book.creator %><%= book.publication_year %><%= link_to "Upvote", upvote_path(book.id)%><%= book.publication_year.to_i%><%= "Upvote"%>
<%= movie.votes.size %> <%= link_to movie.title, work_path(movie.id) %> <%= movie.creator %><%= movie.publication_year %><%= link_to "Upvote", upvote_path(movie.id)%><%= movie.publication_year.to_i %><%= "Upvote" %>
+ + + + + + + + <% @result_work.votes.each do |vote| %> + + + + + <% end %> + +
UserDate
<%= link_to vote.user.name, user_path(vote.user_id) %><%= vote.created_at.to_date.strftime("%B %d, %Y") %>
+ From 28a708d8ca9b039453ec27294671dc591f58ed02 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:46:31 -0700 Subject: [PATCH 36/50] add html and foundation css to albums view files, and update albums controller --- app/controllers/albums_controller.rb | 2 +- app/views/albums/index.html.erb | 6 +++--- app/views/albums/new.html.erb | 8 ++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index 1633b3a4f4..b4276b142a 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -2,7 +2,7 @@ class AlbumsController < WorksController def index user_name - @albums = Work.where(category: "album") + @albums = Work.where(category: "album").order(votes_count: :desc) end def new diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb index 426f1209fc..4940b4410e 100644 --- a/app/views/albums/index.html.erb +++ b/app/views/albums/index.html.erb @@ -17,11 +17,11 @@ <%= link_to album.title, work_path(album.id) %> <%= album.creator %> <%= album.publication_year.to_i %> - <%= "Upvote"%> + <%= link_to "Upvote", list_vote_path(album.id), method: :post, class:"button" %> <% end %> - <%= link_to "View all media", root_path %> - <%= link_to "Add a new album", new_album_path %> + <%= link_to "View all media", root_path, class:"button" %> + <%= link_to "Add a new album", new_album_path, class:"button" %>
diff --git a/app/views/albums/new.html.erb b/app/views/albums/new.html.erb index 3b62c0d958..1b30338d0b 100644 --- a/app/views/albums/new.html.erb +++ b/app/views/albums/new.html.erb @@ -1,3 +1,11 @@ +
    + <% @work.errors.each do |column, msg| %> +
  • + <%= column.capitalize %> <%= msg %> +
  • + <% end %> +
+

Add a new album

<%= render partial: "form_new_work", locals: { form_method: :post } %> From ce253c3c268e561915a69ca7fcdb5fb40f5932c6 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:47:38 -0700 Subject: [PATCH 37/50] add html to users view files --- app/views/users/index.html.erb | 22 ++++++++++++++++++++++ app/views/users/show.html.erb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index e69de29bb2..ad3142e55f 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -0,0 +1,22 @@ +

List of Users

+
+ + + + + + + + + + <% @users.each do |user| %> + + + + + + <% end %> + +
UsernameVotesJoined
<%= link_to user.name, user_path(user.id) %><%= user.votes.size %><%= user.created_at.to_date.strftime("%B %d, %Y") %>
+ <%= link_to "Back to Media List", root_path, class:"button" %> +
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index e69de29bb2..fc5ea14782 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -0,0 +1,31 @@ +
+

User Summary: <%= link_to @result_user.name, user_path(@result_user.id) %>

+

Joined site <%= @result_user.created_at.to_date.strftime("%B %d, %Y") %>

+
+
+

Votes

+ + + + + + + + + + + + <% @result_user.votes.each do |vote| %> + + + + + + + + <% end %> + +
Media TitleCreated ByPublishedCategoryVoted on
<%= link_to vote.work.title, work_path(vote.work_id) %><%= vote.work.creator %><%= vote.work.publication_year %><%= vote.work.category.capitalize %><%= vote.created_at.to_date.strftime("%B %d, %Y") %>
+ <%= link_to "See all Users", users_path, class:"button" %> + <%= link_to "Back to Media List", root_path, class:"button" %> +
From ae56ecf50c3baf91f4f6eefc286eb65d6b739109 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:49:06 -0700 Subject: [PATCH 38/50] add html to movies view files, and update movie controller --- app/controllers/movies_controller.rb | 2 +- app/views/movies/index.html.erb | 6 +++--- app/views/movies/new.html.erb | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 app/views/movies/new.html.erb diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 8354a5cc9b..2408b49602 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -1,7 +1,7 @@ class MoviesController < WorksController def index user_name - @movies = Work.where(category:"movie") + @movies = Work.where(category:"movie").order(votes_count: :desc) end def new diff --git a/app/views/movies/index.html.erb b/app/views/movies/index.html.erb index 892a5c72a0..9b55e85e96 100644 --- a/app/views/movies/index.html.erb +++ b/app/views/movies/index.html.erb @@ -17,11 +17,11 @@ <%= link_to movie.title, work_path(movie.id) %> <%= movie.creator %> <%= movie.publication_year.to_i %> - <%= "Upvote" %> + <%= link_to "Upvote", list_vote_path(movie.id), method: :post, class:"button" %> <% end %> - <%= link_to "View all media", root_path %> - <%= link_to "Add a new movie", new_movie_path %> + <%= link_to "View all media", root_path, class:"button" %> + <%= link_to "Add a new movie", new_movie_path, class:"button" %> diff --git a/app/views/movies/new.html.erb b/app/views/movies/new.html.erb new file mode 100644 index 0000000000..4b68bffb34 --- /dev/null +++ b/app/views/movies/new.html.erb @@ -0,0 +1,11 @@ +
    + <% @work.errors.each do |column, msg| %> +
  • + <%= column.capitalize %> <%= msg %> +
  • + <% end %> +
+ +

Add New Movie

+ +<%= render partial: "form_new_work", locals: { form_method: :post } %> From 3158f72dc5f999854443f351c34de7da3e3d7142 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:50:05 -0700 Subject: [PATCH 39/50] add html to books view files and update books controller --- app/controllers/books_controller.rb | 2 +- app/views/books/index.html.erb | 6 +++--- app/views/books/new.html.erb | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 app/views/books/new.html.erb diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb index 4b5c2717cf..8b3be69303 100644 --- a/app/controllers/books_controller.rb +++ b/app/controllers/books_controller.rb @@ -1,7 +1,7 @@ class BooksController < WorksController def index user_name - @books = Work.where(category:"book") + @books = Work.where(category:"book").order(votes_count: :desc) end def new diff --git a/app/views/books/index.html.erb b/app/views/books/index.html.erb index a85a230b06..91bd9a5871 100644 --- a/app/views/books/index.html.erb +++ b/app/views/books/index.html.erb @@ -17,11 +17,11 @@ <%= link_to book.title, work_path(book.id) %> <%= book.creator %> <%= book.publication_year.to_i%> - <%= "Upvote"%> + <%= link_to "Upvote", list_vote_path(book.id), method: :post, class:"button" %> <% end %> - <%= link_to "View all media", root_path %> - <%= link_to "Add a new book", new_book_path %> + <%= link_to "View all media", root_path, class:"button" %> + <%= link_to "Add a new book", new_book_path, class:"button" %> diff --git a/app/views/books/new.html.erb b/app/views/books/new.html.erb new file mode 100644 index 0000000000..30605f81c8 --- /dev/null +++ b/app/views/books/new.html.erb @@ -0,0 +1,11 @@ +
    + <% @work.errors.each do |column, msg| %> +
  • + <%= column.capitalize %> <%= msg %> +
  • + <% end %> +
+ +

Add New Book

+ +<%= render partial: "form_new_work", locals: { form_method: :post } %> From 373e8d0bcecbfec86c99af3e8eec90139805cb27 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:55:09 -0700 Subject: [PATCH 40/50] add foundation css file to assets --- app/assets/stylesheets/css/app.css | 0 app/assets/stylesheets/css/foundation.css | 4398 +++++++++++++++++ app/assets/stylesheets/css/foundation.min.css | 2 + 3 files changed, 4400 insertions(+) create mode 100644 app/assets/stylesheets/css/app.css create mode 100644 app/assets/stylesheets/css/foundation.css create mode 100644 app/assets/stylesheets/css/foundation.min.css diff --git a/app/assets/stylesheets/css/app.css b/app/assets/stylesheets/css/app.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/css/foundation.css b/app/assets/stylesheets/css/foundation.css new file mode 100644 index 0000000000..dd9aabd0db --- /dev/null +++ b/app/assets/stylesheets/css/foundation.css @@ -0,0 +1,4398 @@ +@charset "UTF-8"; +/** + * Foundation for Sites by ZURB + * Version 6.3.1 + * foundation.zurb.com + * Licensed under MIT Open Source + */ +/*! 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. + */ +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). + */ +body { + margin: 0; } + +/** + * Add the correct display in IE 9-. + */ +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. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; } + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +figcaption, +figure { + display: block; } + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; } + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ } + +/** + * Add the correct display in IE. + */ +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. + */ +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+. + */ +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). + */ +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. + */ +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. + */ +b, +strong { + font-weight: inherit; } + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +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. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; } + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; } + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; } + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; } + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; } + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +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. + */ +button { + overflow: visible; } + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +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. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + /** + * Remove the inner border and padding in Firefox. + */ + /** + * Restore the focus styles unset by the previous rule. + */ } + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +/** + * Show the overflow in Edge. + */ +input { + overflow: visible; } + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[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. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ } + [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. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ +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. + */ +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. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ } + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; } + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE, and Firefox. + */ +details { + display: block; } + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; } + +/* + * Add the correct display in IE 9-. + */ +menu { + display: block; } + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; } + +/** + * Add the correct display in IE. + */ +template { + display: none; } + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; } + +.foundation-mq { + font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } + +html { + box-sizing: border-box; + font-size: 100%; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +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; } + +img { + display: inline-block; + vertical-align: middle; + max-width: 100%; + height: auto; + -ms-interpolation-mode: bicubic; } + +textarea { + height: auto; + min-height: 50px; + border-radius: 0; } + +select { + box-sizing: border-box; + width: 100%; + border-radius: 0; } + +.map_canvas img, +.map_canvas embed, +.map_canvas object, +.mqa-display img, +.mqa-display embed, +.mqa-display object { + max-width: none !important; } + +button { + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0; + border-radius: 0; + background: transparent; + line-height: 1; } + [data-whatinput='mouse'] button { + outline: 0; } + +pre { + overflow: auto; } + +.is-visible { + display: block !important; } + +.is-hidden { + display: none !important; } + +.row { + max-width: 75rem; + margin-right: auto; + margin-left: auto; } + .row::before, .row::after { + display: table; + content: ' '; } + .row::after { + clear: both; } + .row.collapse > .column, .row.collapse > .columns { + padding-right: 0; + padding-left: 0; } + .row .row { + margin-right: -0.625rem; + margin-left: -0.625rem; } + @media print, screen and (min-width: 40em) { + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + @media print, screen and (min-width: 64em) { + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + .row .row.collapse { + margin-right: 0; + margin-left: 0; } + .row.expanded { + max-width: none; } + .row.expanded .row { + margin-right: auto; + margin-left: auto; } + .row:not(.expanded) .row { + max-width: none; } + .row.gutter-small > .column, .row.gutter-small > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; } + .row.gutter-medium > .column, .row.gutter-medium > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + +.column, .columns { + width: 100%; + float: left; + padding-right: 0.625rem; + padding-left: 0.625rem; } + @media print, screen and (min-width: 40em) { + .column, .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } } + .column:last-child:not(:first-child), .columns:last-child:not(:first-child) { + float: right; } + .column.end:last-child:last-child, .end.columns:last-child:last-child { + float: left; } + +.column.row.row, .row.row.columns { + float: none; } + +.row .column.row.row, .row .row.row.columns { + margin-right: 0; + margin-left: 0; + padding-right: 0; + padding-left: 0; } + +.small-1 { + width: 8.33333%; } + +.small-push-1 { + position: relative; + left: 8.33333%; } + +.small-pull-1 { + position: relative; + left: -8.33333%; } + +.small-offset-0 { + margin-left: 0%; } + +.small-2 { + width: 16.66667%; } + +.small-push-2 { + position: relative; + left: 16.66667%; } + +.small-pull-2 { + position: relative; + left: -16.66667%; } + +.small-offset-1 { + margin-left: 8.33333%; } + +.small-3 { + width: 25%; } + +.small-push-3 { + position: relative; + left: 25%; } + +.small-pull-3 { + position: relative; + left: -25%; } + +.small-offset-2 { + margin-left: 16.66667%; } + +.small-4 { + width: 33.33333%; } + +.small-push-4 { + position: relative; + left: 33.33333%; } + +.small-pull-4 { + position: relative; + left: -33.33333%; } + +.small-offset-3 { + margin-left: 25%; } + +.small-5 { + width: 41.66667%; } + +.small-push-5 { + position: relative; + left: 41.66667%; } + +.small-pull-5 { + position: relative; + left: -41.66667%; } + +.small-offset-4 { + margin-left: 33.33333%; } + +.small-6 { + width: 50%; } + +.small-push-6 { + position: relative; + left: 50%; } + +.small-pull-6 { + position: relative; + left: -50%; } + +.small-offset-5 { + margin-left: 41.66667%; } + +.small-7 { + width: 58.33333%; } + +.small-push-7 { + position: relative; + left: 58.33333%; } + +.small-pull-7 { + position: relative; + left: -58.33333%; } + +.small-offset-6 { + margin-left: 50%; } + +.small-8 { + width: 66.66667%; } + +.small-push-8 { + position: relative; + left: 66.66667%; } + +.small-pull-8 { + position: relative; + left: -66.66667%; } + +.small-offset-7 { + margin-left: 58.33333%; } + +.small-9 { + width: 75%; } + +.small-push-9 { + position: relative; + left: 75%; } + +.small-pull-9 { + position: relative; + left: -75%; } + +.small-offset-8 { + margin-left: 66.66667%; } + +.small-10 { + width: 83.33333%; } + +.small-push-10 { + position: relative; + left: 83.33333%; } + +.small-pull-10 { + position: relative; + left: -83.33333%; } + +.small-offset-9 { + margin-left: 75%; } + +.small-11 { + width: 91.66667%; } + +.small-push-11 { + position: relative; + left: 91.66667%; } + +.small-pull-11 { + position: relative; + left: -91.66667%; } + +.small-offset-10 { + margin-left: 83.33333%; } + +.small-12 { + width: 100%; } + +.small-offset-11 { + margin-left: 91.66667%; } + +.small-up-1 > .column, .small-up-1 > .columns { + float: left; + width: 100%; } + .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { + float: left; } + +.small-up-2 > .column, .small-up-2 > .columns { + float: left; + width: 50%; } + .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { + float: left; } + +.small-up-3 > .column, .small-up-3 > .columns { + float: left; + width: 33.33333%; } + .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { + float: left; } + +.small-up-4 > .column, .small-up-4 > .columns { + float: left; + width: 25%; } + .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { + float: left; } + +.small-up-5 > .column, .small-up-5 > .columns { + float: left; + width: 20%; } + .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { + float: left; } + +.small-up-6 > .column, .small-up-6 > .columns { + float: left; + width: 16.66667%; } + .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { + float: left; } + +.small-up-7 > .column, .small-up-7 > .columns { + float: left; + width: 14.28571%; } + .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { + float: left; } + +.small-up-8 > .column, .small-up-8 > .columns { + float: left; + width: 12.5%; } + .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { + float: left; } + +.small-collapse > .column, .small-collapse > .columns { + padding-right: 0; + padding-left: 0; } + +.small-collapse .row { + margin-right: 0; + margin-left: 0; } + +.expanded.row .small-collapse.row { + margin-right: 0; + margin-left: 0; } + +.small-uncollapse > .column, .small-uncollapse > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; } + +.small-centered { + margin-right: auto; + margin-left: auto; } + .small-centered, .small-centered:last-child:not(:first-child) { + float: none; + clear: both; } + +.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) { + .medium-1 { + width: 8.33333%; } + .medium-push-1 { + position: relative; + left: 8.33333%; } + .medium-pull-1 { + position: relative; + left: -8.33333%; } + .medium-offset-0 { + margin-left: 0%; } + .medium-2 { + width: 16.66667%; } + .medium-push-2 { + position: relative; + left: 16.66667%; } + .medium-pull-2 { + position: relative; + left: -16.66667%; } + .medium-offset-1 { + margin-left: 8.33333%; } + .medium-3 { + width: 25%; } + .medium-push-3 { + position: relative; + left: 25%; } + .medium-pull-3 { + position: relative; + left: -25%; } + .medium-offset-2 { + margin-left: 16.66667%; } + .medium-4 { + width: 33.33333%; } + .medium-push-4 { + position: relative; + left: 33.33333%; } + .medium-pull-4 { + position: relative; + left: -33.33333%; } + .medium-offset-3 { + margin-left: 25%; } + .medium-5 { + width: 41.66667%; } + .medium-push-5 { + position: relative; + left: 41.66667%; } + .medium-pull-5 { + position: relative; + left: -41.66667%; } + .medium-offset-4 { + margin-left: 33.33333%; } + .medium-6 { + width: 50%; } + .medium-push-6 { + position: relative; + left: 50%; } + .medium-pull-6 { + position: relative; + left: -50%; } + .medium-offset-5 { + margin-left: 41.66667%; } + .medium-7 { + width: 58.33333%; } + .medium-push-7 { + position: relative; + left: 58.33333%; } + .medium-pull-7 { + position: relative; + left: -58.33333%; } + .medium-offset-6 { + margin-left: 50%; } + .medium-8 { + width: 66.66667%; } + .medium-push-8 { + position: relative; + left: 66.66667%; } + .medium-pull-8 { + position: relative; + left: -66.66667%; } + .medium-offset-7 { + margin-left: 58.33333%; } + .medium-9 { + width: 75%; } + .medium-push-9 { + position: relative; + left: 75%; } + .medium-pull-9 { + position: relative; + left: -75%; } + .medium-offset-8 { + margin-left: 66.66667%; } + .medium-10 { + width: 83.33333%; } + .medium-push-10 { + position: relative; + left: 83.33333%; } + .medium-pull-10 { + position: relative; + left: -83.33333%; } + .medium-offset-9 { + margin-left: 75%; } + .medium-11 { + width: 91.66667%; } + .medium-push-11 { + position: relative; + left: 91.66667%; } + .medium-pull-11 { + position: relative; + left: -91.66667%; } + .medium-offset-10 { + margin-left: 83.33333%; } + .medium-12 { + width: 100%; } + .medium-offset-11 { + margin-left: 91.66667%; } + .medium-up-1 > .column, .medium-up-1 > .columns { + float: left; + width: 100%; } + .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { + float: left; } + .medium-up-2 > .column, .medium-up-2 > .columns { + float: left; + width: 50%; } + .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { + float: left; } + .medium-up-3 > .column, .medium-up-3 > .columns { + float: left; + width: 33.33333%; } + .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { + float: left; } + .medium-up-4 > .column, .medium-up-4 > .columns { + float: left; + width: 25%; } + .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { + float: left; } + .medium-up-5 > .column, .medium-up-5 > .columns { + float: left; + width: 20%; } + .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { + float: left; } + .medium-up-6 > .column, .medium-up-6 > .columns { + float: left; + width: 16.66667%; } + .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { + float: left; } + .medium-up-7 > .column, .medium-up-7 > .columns { + float: left; + width: 14.28571%; } + .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { + float: left; } + .medium-up-8 > .column, .medium-up-8 > .columns { + float: left; + width: 12.5%; } + .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { + float: left; } + .medium-collapse > .column, .medium-collapse > .columns { + padding-right: 0; + padding-left: 0; } + .medium-collapse .row { + margin-right: 0; + margin-left: 0; } + .expanded.row .medium-collapse.row { + margin-right: 0; + margin-left: 0; } + .medium-uncollapse > .column, .medium-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + .medium-centered { + margin-right: auto; + margin-left: auto; } + .medium-centered, .medium-centered:last-child:not(:first-child) { + float: none; + clear: both; } + .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) { + .large-1 { + width: 8.33333%; } + .large-push-1 { + position: relative; + left: 8.33333%; } + .large-pull-1 { + position: relative; + left: -8.33333%; } + .large-offset-0 { + margin-left: 0%; } + .large-2 { + width: 16.66667%; } + .large-push-2 { + position: relative; + left: 16.66667%; } + .large-pull-2 { + position: relative; + left: -16.66667%; } + .large-offset-1 { + margin-left: 8.33333%; } + .large-3 { + width: 25%; } + .large-push-3 { + position: relative; + left: 25%; } + .large-pull-3 { + position: relative; + left: -25%; } + .large-offset-2 { + margin-left: 16.66667%; } + .large-4 { + width: 33.33333%; } + .large-push-4 { + position: relative; + left: 33.33333%; } + .large-pull-4 { + position: relative; + left: -33.33333%; } + .large-offset-3 { + margin-left: 25%; } + .large-5 { + width: 41.66667%; } + .large-push-5 { + position: relative; + left: 41.66667%; } + .large-pull-5 { + position: relative; + left: -41.66667%; } + .large-offset-4 { + margin-left: 33.33333%; } + .large-6 { + width: 50%; } + .large-push-6 { + position: relative; + left: 50%; } + .large-pull-6 { + position: relative; + left: -50%; } + .large-offset-5 { + margin-left: 41.66667%; } + .large-7 { + width: 58.33333%; } + .large-push-7 { + position: relative; + left: 58.33333%; } + .large-pull-7 { + position: relative; + left: -58.33333%; } + .large-offset-6 { + margin-left: 50%; } + .large-8 { + width: 66.66667%; } + .large-push-8 { + position: relative; + left: 66.66667%; } + .large-pull-8 { + position: relative; + left: -66.66667%; } + .large-offset-7 { + margin-left: 58.33333%; } + .large-9 { + width: 75%; } + .large-push-9 { + position: relative; + left: 75%; } + .large-pull-9 { + position: relative; + left: -75%; } + .large-offset-8 { + margin-left: 66.66667%; } + .large-10 { + width: 83.33333%; } + .large-push-10 { + position: relative; + left: 83.33333%; } + .large-pull-10 { + position: relative; + left: -83.33333%; } + .large-offset-9 { + margin-left: 75%; } + .large-11 { + width: 91.66667%; } + .large-push-11 { + position: relative; + left: 91.66667%; } + .large-pull-11 { + position: relative; + left: -91.66667%; } + .large-offset-10 { + margin-left: 83.33333%; } + .large-12 { + width: 100%; } + .large-offset-11 { + margin-left: 91.66667%; } + .large-up-1 > .column, .large-up-1 > .columns { + float: left; + width: 100%; } + .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { + float: left; } + .large-up-2 > .column, .large-up-2 > .columns { + float: left; + width: 50%; } + .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { + float: left; } + .large-up-3 > .column, .large-up-3 > .columns { + float: left; + width: 33.33333%; } + .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { + float: left; } + .large-up-4 > .column, .large-up-4 > .columns { + float: left; + width: 25%; } + .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { + float: left; } + .large-up-5 > .column, .large-up-5 > .columns { + float: left; + width: 20%; } + .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { + float: left; } + .large-up-6 > .column, .large-up-6 > .columns { + float: left; + width: 16.66667%; } + .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { + float: left; } + .large-up-7 > .column, .large-up-7 > .columns { + float: left; + width: 14.28571%; } + .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { + float: left; } + .large-up-8 > .column, .large-up-8 > .columns { + float: left; + width: 12.5%; } + .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { + float: left; } + .large-collapse > .column, .large-collapse > .columns { + padding-right: 0; + padding-left: 0; } + .large-collapse .row { + margin-right: 0; + margin-left: 0; } + .expanded.row .large-collapse.row { + margin-right: 0; + margin-left: 0; } + .large-uncollapse > .column, .large-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + .large-centered { + margin-right: auto; + margin-left: auto; } + .large-centered, .large-centered:last-child:not(:first-child) { + float: none; + clear: both; } + .large-uncentered, + .large-push-0, + .large-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; } } + +.column-block { + margin-bottom: 1.25rem; } + .column-block > :last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .column-block { + margin-bottom: 1.875rem; } + .column-block > :last-child { + margin-bottom: 0; } } + +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; } + +p { + margin-bottom: 1rem; + font-size: inherit; + line-height: 1.6; + text-rendering: optimizeLegibility; } + +em, +i { + font-style: italic; + line-height: inherit; } + +strong, +b { + font-weight: bold; + line-height: inherit; } + +small { + font-size: 80%; + line-height: inherit; } + +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; } + h1 small, + h2 small, + h3 small, + h4 small, + h5 small, + h6 small { + line-height: 0; + color: #cacaca; } + +h1 { + font-size: 1.5rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h2 { + font-size: 1.25rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h3 { + font-size: 1.1875rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h4 { + font-size: 1.125rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h5 { + font-size: 1.0625rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h6 { + font-size: 1rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +@media print, screen and (min-width: 40em) { + h1 { + font-size: 3rem; } + h2 { + font-size: 2.5rem; } + h3 { + font-size: 1.9375rem; } + h4 { + font-size: 1.5625rem; } + h5 { + font-size: 1.25rem; } + h6 { + font-size: 1rem; } } + +a { + line-height: inherit; + color: #1779ba; + text-decoration: none; + cursor: pointer; } + a:hover, a:focus { + color: #1468a0; } + a img { + border: 0; } + +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; } + +ul, +ol, +dl { + margin-bottom: 1rem; + list-style-position: outside; + line-height: 1.6; } + +li { + font-size: inherit; } + +ul { + margin-left: 1.25rem; + list-style-type: disc; } + +ol { + margin-left: 1.25rem; } + +ul ul, ol ul, ul ol, ol ol { + margin-left: 1.25rem; + margin-bottom: 0; } + +dl { + margin-bottom: 1rem; } + dl dt { + margin-bottom: 0.3rem; + font-weight: bold; } + +blockquote { + margin: 0 0 1rem; + padding: 0.5625rem 1.25rem 0 1.1875rem; + border-left: 1px solid #cacaca; } + blockquote, blockquote p { + line-height: 1.6; + color: #8a8a8a; } + +cite { + display: block; + font-size: 0.8125rem; + color: #8a8a8a; } + cite:before { + content: "— "; } + +abbr { + border-bottom: 1px dotted #0a0a0a; + color: #0a0a0a; + cursor: help; } + +figure { + margin: 0; } + +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; } + +kbd { + margin: 0; + padding: 0.125rem 0.25rem 0; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + color: #0a0a0a; } + +.subheader { + margin-top: 0.2rem; + margin-bottom: 0.5rem; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; } + +.lead { + font-size: 125%; + line-height: 1.6; } + +.stat { + font-size: 2.5rem; + line-height: 1; } + p + .stat { + margin-top: -1rem; } + +.no-bullet { + margin-left: 0; + list-style: none; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +@media print, screen and (min-width: 40em) { + .medium-text-left { + text-align: left; } + .medium-text-right { + text-align: right; } + .medium-text-center { + text-align: center; } + .medium-text-justify { + text-align: justify; } } + +@media print, screen and (min-width: 64em) { + .large-text-left { + text-align: left; } + .large-text-right { + text-align: right; } + .large-text-center { + text-align: center; } + .large-text-justify { + text-align: justify; } } + +.show-for-print { + display: none !important; } + +@media print { + * { + background: transparent !important; + box-shadow: none !important; + color: black !important; + text-shadow: none !important; } + .show-for-print { + display: block !important; } + .hide-for-print { + display: none !important; } + table.show-for-print { + display: table !important; } + thead.show-for-print { + display: table-header-group !important; } + tbody.show-for-print { + display: table-row-group !important; } + tr.show-for-print { + display: table-row !important; } + td.show-for-print { + display: table-cell !important; } + th.show-for-print { + display: table-cell !important; } + a, + a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + .ir a:after, + a[href^='javascript:']:after, + a[href^='#']:after { + content: ''; } + abbr[title]:after { + content: " (" attr(title) ")"; } + pre, + blockquote { + border: 1px solid #8a8a8a; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + @page { + margin: 0.5cm; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } } + +.button { + display: inline-block; + vertical-align: middle; + margin: 0 0 1rem 0; + 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; } + [data-whatinput='mouse'] .button { + outline: 0; } + .button:hover, .button:focus { + background-color: #14679e; + color: #fefefe; } + .button.tiny { + font-size: 0.6rem; } + .button.small { + font-size: 0.75rem; } + .button.large { + font-size: 1.25rem; } + .button.expanded { + display: block; + width: 100%; + margin-right: 0; + margin-left: 0; } + .button.primary { + background-color: #1779ba; + color: #fefefe; } + .button.primary:hover, .button.primary:focus { + background-color: #126195; + color: #fefefe; } + .button.secondary { + background-color: #767676; + color: #fefefe; } + .button.secondary:hover, .button.secondary:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button.success { + background-color: #3adb76; + color: #0a0a0a; } + .button.success:hover, .button.success:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button.warning { + background-color: #ffae00; + color: #0a0a0a; } + .button.warning:hover, .button.warning:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button.alert { + background-color: #cc4b37; + color: #fefefe; } + .button.alert:hover, .button.alert:focus { + background-color: #a53b2a; + color: #fefefe; } + .button.hollow { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow, .button.hollow:hover, .button.hollow:focus { + background-color: transparent; } + .button.hollow:hover, .button.hollow:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.primary { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow.primary:hover, .button.hollow.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.secondary { + border: 1px solid #767676; + color: #767676; } + .button.hollow.secondary:hover, .button.hollow.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; } + .button.hollow.success { + border: 1px solid #3adb76; + color: #3adb76; } + .button.hollow.success:hover, .button.hollow.success:focus { + border-color: #157539; + color: #157539; } + .button.hollow.warning { + border: 1px solid #ffae00; + color: #ffae00; } + .button.hollow.warning:hover, .button.hollow.warning:focus { + border-color: #805700; + color: #805700; } + .button.hollow.alert { + border: 1px solid #cc4b37; + color: #cc4b37; } + .button.hollow.alert:hover, .button.hollow.alert:focus { + border-color: #67251a; + color: #67251a; } + .button.disabled, .button[disabled] { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus { + background-color: #1779ba; + color: #fefefe; } + .button.disabled.primary, .button[disabled].primary { + opacity: 0.25; + cursor: not-allowed; } + .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; } + .button.disabled.secondary, .button[disabled].secondary { + opacity: 0.25; + cursor: not-allowed; } + .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; } + .button.disabled.success, .button[disabled].success { + opacity: 0.25; + cursor: not-allowed; } + .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; } + .button.disabled.warning, .button[disabled].warning { + opacity: 0.25; + cursor: not-allowed; } + .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; } + .button.disabled.alert, .button[disabled].alert { + opacity: 0.25; + cursor: not-allowed; } + .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; } + .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; } + .button.arrow-only::after { + top: -0.1em; + float: none; + margin-left: 0; } + +[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; + color: #0a0a0a; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + [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; } + +textarea { + max-width: 100%; } + textarea[rows] { + height: auto; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #cacaca; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #cacaca; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #cacaca; } + +input::placeholder, +textarea::placeholder { + color: #cacaca; } + +input:disabled, input[readonly], +textarea:disabled, +textarea[readonly] { + background-color: #e6e6e6; + cursor: not-allowed; } + +[type='submit'], +[type='button'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0; } + +input[type='search'] { + box-sizing: border-box; } + +[type='file'], +[type='checkbox'], +[type='radio'] { + margin: 0 0 1rem; } + +[type='checkbox'] + label, +[type='radio'] + label { + display: inline-block; + vertical-align: baseline; + margin-left: 0.5rem; + margin-right: 1rem; + margin-bottom: 0; } + [type='checkbox'] + label[for], + [type='radio'] + label[for] { + cursor: pointer; } + +label > [type='checkbox'], +label > [type='radio'] { + margin-right: 0.5rem; } + +[type='file'] { + width: 100%; } + +label { + display: block; + margin: 0; + font-size: 0.875rem; + font-weight: normal; + line-height: 1.8; + color: #0a0a0a; } + label.middle { + margin: 0 0 1rem; + padding: 0.5625rem 0; } + +.help-text { + margin-top: -0.5rem; + font-size: 0.8125rem; + font-style: italic; + color: #0a0a0a; } + +.input-group { + display: table; + width: 100%; + margin-bottom: 1rem; } + .input-group > :first-child { + border-radius: 0 0 0 0; } + .input-group > :last-child > * { + border-radius: 0 0 0 0; } + +.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; + display: table-cell; + vertical-align: middle; } + +.input-group-label { + padding: 0 1rem; + border: 1px solid #cacaca; + background: #e6e6e6; + color: #0a0a0a; + text-align: center; + white-space: nowrap; + width: 1%; + height: 100%; } + .input-group-label:first-child { + border-right: 0; } + .input-group-label:last-child { + border-left: 0; } + +.input-group-field { + border-radius: 0; + height: 2.5rem; } + +.input-group-button { + padding-top: 0; + padding-bottom: 0; + text-align: center; + width: 1%; + height: 100%; } + .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; } + +.input-group .input-group-button { + display: table-cell; } + +fieldset { + margin: 0; + padding: 0; + border: 0; } + +legend { + max-width: 100%; + margin-bottom: 0.5rem; } + +.fieldset { + margin: 1.125rem 0; + padding: 1.25rem; + border: 1px solid #cacaca; } + .fieldset legend { + margin: 0; + margin-left: -0.1875rem; + padding: 0 0.1875rem; + background: #fefefe; } + +select { + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-family: inherit; + font-size: 1rem; + line-height: normal; + 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) { + select { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } + 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; } + select:disabled { + background-color: #e6e6e6; + cursor: not-allowed; } + select::-ms-expand { + display: none; } + select[multiple] { + height: auto; + background-image: none; } + +.is-invalid-input:not(:focus) { + border-color: #cc4b37; + background-color: #f9ecea; } + .is-invalid-input:not(:focus)::-webkit-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::-moz-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus):-ms-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::placeholder { + color: #cc4b37; } + +.is-invalid-label { + color: #cc4b37; } + +.form-error { + display: none; + margin-top: -0.5rem; + margin-bottom: 1rem; + font-size: 0.75rem; + font-weight: bold; + color: #cc4b37; } + .form-error.is-visible { + display: block; } + +.accordion { + margin-left: 0; + background: #fefefe; + list-style-type: none; } + +.accordion-item:first-child > :first-child { + border-radius: 0 0 0 0; } + +.accordion-item:last-child > :last-child { + border-radius: 0 0 0 0; } + +.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; } + :last-child:not(.is-active) > .accordion-title { + border-bottom: 1px solid #e6e6e6; + border-radius: 0 0 0 0; } + .accordion-title:hover, .accordion-title:focus { + background-color: #e6e6e6; } + .accordion-title::before { + position: absolute; + top: 50%; + right: 1rem; + margin-top: -0.5rem; + content: '+'; } + .is-active > .accordion-title::before { + content: '\2013'; } + +.accordion-content { + display: none; + padding: 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #fefefe; + color: #0a0a0a; } + :last-child > .accordion-content:last-child { + border-bottom: 1px solid #e6e6e6; } + +.is-accordion-submenu-parent > a { + position: relative; } + .is-accordion-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; + position: absolute; + top: 50%; + margin-top: -3px; + right: 1rem; } + +.is-accordion-submenu-parent[aria-expanded='true'] > a::after { + -ms-transform: rotate(180deg); + transform: rotate(180deg); + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; } + +.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; } + .badge.primary { + background: #1779ba; + color: #fefefe; } + .badge.secondary { + background: #767676; + color: #fefefe; } + .badge.success { + background: #3adb76; + color: #0a0a0a; } + .badge.warning { + background: #ffae00; + color: #0a0a0a; } + .badge.alert { + background: #cc4b37; + color: #fefefe; } + +.breadcrumbs { + margin: 0 0 1rem 0; + list-style: none; } + .breadcrumbs::before, .breadcrumbs::after { + display: table; + content: ' '; } + .breadcrumbs::after { + clear: both; } + .breadcrumbs li { + float: left; + font-size: 0.6875rem; + color: #0a0a0a; + cursor: default; + text-transform: uppercase; } + .breadcrumbs li:not(:last-child)::after { + position: relative; + top: 1px; + margin: 0 0.75rem; + opacity: 1; + content: "/"; + color: #cacaca; } + .breadcrumbs a { + color: #1779ba; } + .breadcrumbs a:hover { + text-decoration: underline; } + .breadcrumbs .disabled { + color: #cacaca; + cursor: not-allowed; } + +.button-group { + margin-bottom: 1rem; + font-size: 0; } + .button-group::before, .button-group::after { + display: table; + content: ' '; } + .button-group::after { + clear: both; } + .button-group .button { + margin: 0; + margin-right: 1px; + margin-bottom: 1px; + font-size: 0.9rem; } + .button-group .button:last-child { + margin-right: 0; } + .button-group.tiny .button { + font-size: 0.6rem; } + .button-group.small .button { + font-size: 0.75rem; } + .button-group.large .button { + font-size: 1.25rem; } + .button-group.expanded { + margin-right: -1px; } + .button-group.expanded::before, .button-group.expanded::after { + display: none; } + .button-group.expanded .button:first-child:last-child { + width: 100%; } + .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button { + display: inline-block; + width: calc(50% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button { + display: inline-block; + width: calc(33.33333% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button { + display: inline-block; + width: calc(25% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button { + display: inline-block; + width: calc(20% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button { + display: inline-block; + width: calc(16.66667% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child { + margin-right: -6px; } + .button-group.primary .button { + background-color: #1779ba; + color: #fefefe; } + .button-group.primary .button:hover, .button-group.primary .button:focus { + background-color: #126195; + color: #fefefe; } + .button-group.secondary .button { + background-color: #767676; + color: #fefefe; } + .button-group.secondary .button:hover, .button-group.secondary .button:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button-group.success .button { + background-color: #3adb76; + color: #0a0a0a; } + .button-group.success .button:hover, .button-group.success .button:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button-group.warning .button { + background-color: #ffae00; + color: #0a0a0a; } + .button-group.warning .button:hover, .button-group.warning .button:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button-group.alert .button { + background-color: #cc4b37; + color: #fefefe; } + .button-group.alert .button:hover, .button-group.alert .button:focus { + background-color: #a53b2a; + color: #fefefe; } + .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { + width: 100%; } + .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) { + .button-group.stacked-for-small .button { + width: auto; + margin-bottom: 0; } } + @media print, screen and (min-width: 64em) { + .button-group.stacked-for-medium .button { + width: auto; + margin-bottom: 0; } } + @media screen and (max-width: 39.9375em) { + .button-group.stacked-for-small.expanded { + display: block; } + .button-group.stacked-for-small.expanded .button { + display: block; + margin-right: 0; } } + +.card { + margin-bottom: 1rem; + border: 1px solid #e6e6e6; + border-radius: 0; + background: #fefefe; + box-shadow: none; + overflow: hidden; + color: #0a0a0a; } + .card > :last-child { + margin-bottom: 0; } + +.card-divider { + padding: 1rem; + background: #e6e6e6; } + .card-divider > :last-child { + margin-bottom: 0; } + +.card-section { + padding: 1rem; } + .card-section > :last-child { + margin-bottom: 0; } + +.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; } + .callout > :first-child { + margin-top: 0; } + .callout > :last-child { + margin-bottom: 0; } + .callout.primary { + background-color: #d7ecfa; + color: #0a0a0a; } + .callout.secondary { + background-color: #eaeaea; + color: #0a0a0a; } + .callout.success { + background-color: #e1faea; + color: #0a0a0a; } + .callout.warning { + background-color: #fff3d9; + color: #0a0a0a; } + .callout.alert { + background-color: #f7e4e1; + color: #0a0a0a; } + .callout.small { + padding-top: 0.5rem; + padding-right: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.5rem; } + .callout.large { + padding-top: 3rem; + padding-right: 3rem; + padding-bottom: 3rem; + padding-left: 3rem; } + +.close-button { + position: absolute; + color: #8a8a8a; + cursor: pointer; } + [data-whatinput='mouse'] .close-button { + outline: 0; } + .close-button:hover, .close-button:focus { + color: #0a0a0a; } + .close-button.small { + right: 0.66rem; + top: 0.33em; + font-size: 1.5em; + line-height: 1; } + .close-button, .close-button.medium { + right: 1rem; + top: 0.5rem; + font-size: 2em; + line-height: 1; } + +.menu { + margin: 0; + list-style-type: none; } + .menu > li { + display: table-cell; + vertical-align: middle; } + [data-whatinput='mouse'] .menu > li { + outline: 0; } + .menu > li > a { + display: block; + padding: 0.7rem 1rem; + line-height: 1; } + .menu input, + .menu select, + .menu a, + .menu button { + margin-bottom: 0; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + vertical-align: middle; } + .menu > li > a img + span, + .menu > li > a i + span, + .menu > li > a svg + span { + vertical-align: middle; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + margin-right: 0.25rem; + display: inline-block; } + .menu > li, .menu.horizontal > li { + display: table-cell; } + .menu.expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.expanded > li:first-child:last-child { + width: 100%; } + .menu.vertical > li { + display: block; } + @media print, screen and (min-width: 40em) { + .menu.medium-horizontal > li { + display: table-cell; } + .menu.medium-expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.medium-expanded > li:first-child:last-child { + width: 100%; } + .menu.medium-vertical > li { + display: block; } } + @media print, screen and (min-width: 64em) { + .menu.large-horizontal > li { + display: table-cell; } + .menu.large-expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.large-expanded > li:first-child:last-child { + width: 100%; } + .menu.large-vertical > li { + display: block; } } + .menu.simple li { + display: inline-block; + vertical-align: top; + line-height: 1; } + .menu.simple a { + padding: 0; } + .menu.simple li { + margin-left: 0; + margin-right: 1rem; } + .menu.simple.align-right li { + margin-right: 0; + margin-left: 1rem; } + .menu.align-right::before, .menu.align-right::after { + display: table; + content: ' '; } + .menu.align-right::after { + clear: both; } + .menu.align-right > li { + float: right; } + .menu.icon-top > li > a { + text-align: center; } + .menu.icon-top > li > a img, + .menu.icon-top > li > a i, + .menu.icon-top > li > a svg { + display: block; + margin: 0 auto 0.25rem; } + .menu.icon-top.vertical a > span { + margin: auto; } + .menu.nested { + margin-left: 1rem; } + .menu .active > a { + background: #1779ba; + color: #fefefe; } + .menu.menu-bordered li { + border: 1px solid #e6e6e6; } + .menu.menu-bordered li:not(:first-child) { + border-top: 0; } + .menu.menu-hover li:hover { + background-color: #e6e6e6; } + +.menu-text { + padding-top: 0; + padding-bottom: 0; + padding: 0.7rem 1rem; + font-weight: bold; + line-height: 1; + color: inherit; } + +.menu-centered { + text-align: center; } + .menu-centered > .menu { + display: inline-block; + vertical-align: top; } + +.no-js [data-responsive-menu] ul { + display: none; } + +.menu-icon { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .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: ''; } + .menu-icon:hover::after { + background: #cacaca; + box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } + +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .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: ''; } + .menu-icon.dark:hover::after { + background: #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } + +.is-drilldown { + position: relative; + overflow: hidden; } + .is-drilldown li { + display: block; } + .is-drilldown.animate-height { + transition: height 0.5s; } + +.is-drilldown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: -1; + width: 100%; + background: #fefefe; + transition: transform 0.15s linear; } + .is-drilldown-submenu.is-active { + z-index: 1; + display: block; + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + .is-drilldown-submenu.is-closing { + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.drilldown-submenu-cover-previous { + min-height: 100%; } + +.is-drilldown-submenu-parent > a { + position: relative; } + .is-drilldown-submenu-parent > 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; + position: absolute; + top: 50%; + margin-top: -6px; + right: 1rem; } + +.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; } + +.dropdown-pane { + position: absolute; + z-index: 10; + display: block; + width: 300px; + padding: 1rem; + visibility: hidden; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-size: 1rem; } + .dropdown-pane.is-open { + visibility: visible; } + +.dropdown-pane.tiny { + width: 100px; } + +.dropdown-pane.small { + width: 200px; } + +.dropdown-pane.large { + width: 400px; } + +.dropdown.menu > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + +.dropdown.menu > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + +.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; } + +[data-whatinput='mouse'] .dropdown.menu a { + outline: 0; } + +.no-js .dropdown.menu ul { + display: none; } + +.dropdown.menu.vertical > li .is-dropdown-submenu { + top: 0; } + +.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + +.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.dropdown.menu.vertical > li > a::after { + right: 14px; } + +.dropdown.menu.vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + +.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) { + .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .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; } + .dropdown.menu.medium-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.medium-vertical > li > a::after { + right: 14px; } + .dropdown.menu.medium-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .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) { + .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .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; } + .dropdown.menu.large-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.large-vertical > li > a::after { + right: 14px; } + .dropdown.menu.large-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .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; } } + +.dropdown.menu.align-right .is-dropdown-submenu.first-sub { + top: 100%; + right: 0; + left: auto; } + +.is-dropdown-menu.vertical { + width: 100px; } + .is-dropdown-menu.vertical.align-right { + float: right; } + +.is-dropdown-submenu-parent { + position: relative; } + .is-dropdown-submenu-parent a::after { + position: absolute; + top: 50%; + right: 5px; + margin-top: -6px; } + .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { + top: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.is-dropdown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: 1; + display: none; + min-width: 200px; + border: 1px solid #cacaca; + background: #fefefe; } + .is-dropdown-submenu .is-dropdown-submenu-parent > a::after { + right: 14px; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .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; } + .is-dropdown-submenu .is-dropdown-submenu { + margin-top: -1px; } + .is-dropdown-submenu > li { + width: 100%; } + .is-dropdown-submenu.js-dropdown-active { + display: block; } + +.responsive-embed, +.flex-video { + position: relative; + height: 0; + margin-bottom: 1rem; + padding-bottom: 75%; + overflow: hidden; } + .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%; } + .responsive-embed.widescreen, + .flex-video.widescreen { + padding-bottom: 56.25%; } + +.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; } + .label.primary { + background: #1779ba; + color: #fefefe; } + .label.secondary { + background: #767676; + color: #fefefe; } + .label.success { + background: #3adb76; + color: #0a0a0a; } + .label.warning { + background: #ffae00; + color: #0a0a0a; } + .label.alert { + background: #cc4b37; + color: #fefefe; } + +.media-object { + display: block; + margin-bottom: 1rem; } + .media-object img { + max-width: none; } + @media screen and (max-width: 39.9375em) { + .media-object.stack-for-small .media-object-section { + padding: 0; + padding-bottom: 1rem; + display: block; } + .media-object.stack-for-small .media-object-section img { + width: 100%; } } + +.media-object-section { + display: table-cell; + vertical-align: top; } + .media-object-section:first-child { + padding-right: 1rem; } + .media-object-section:last-child:not(:nth-child(2)) { + padding-left: 1rem; } + .media-object-section > :last-child { + margin-bottom: 0; } + .media-object-section.middle { + vertical-align: middle; } + .media-object-section.bottom { + vertical-align: bottom; } + +.is-off-canvas-open { + overflow: hidden; } + +.js-off-canvas-overlay { + position: absolute; + top: 0; + left: 0; + 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; } + .js-off-canvas-overlay.is-visible { + opacity: 1; + visibility: visible; } + .js-off-canvas-overlay.is-closable { + cursor: pointer; } + .js-off-canvas-overlay.is-overlay-absolute { + position: absolute; } + .js-off-canvas-overlay.is-overlay-fixed { + position: fixed; } + +.off-canvas-wrapper { + position: relative; + overflow: hidden; } + +.off-canvas { + position: fixed; + z-index: 1; + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas { + outline: 0; } + .off-canvas.is-transition-overlap { + z-index: 10; } + .off-canvas.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas.is-open { + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.off-canvas-absolute { + position: absolute; + z-index: 1; + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas-absolute { + outline: 0; } + .off-canvas-absolute.is-transition-overlap { + z-index: 10; } + .off-canvas-absolute.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas-absolute.is-open { + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.position-left { + top: 0; + left: 0; + width: 250px; + height: 100%; + -ms-transform: translateX(-250px); + transform: translateX(-250px); + overflow-y: auto; } + .position-left.is-open ~ .off-canvas-content { + -ms-transform: translateX(250px); + transform: translateX(250px); } + .position-left.is-transition-push::after { + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 1px; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-left.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-right { + top: 0; + right: 0; + width: 250px; + height: 100%; + -ms-transform: translateX(250px); + transform: translateX(250px); + overflow-y: auto; } + .position-right.is-open ~ .off-canvas-content { + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + .position-right.is-transition-push::after { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 1px; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-right.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-top { + top: 0; + left: 0; + width: 100%; + height: 250px; + -ms-transform: translateY(-250px); + transform: translateY(-250px); + overflow-x: auto; } + .position-top.is-open ~ .off-canvas-content { + -ms-transform: translateY(250px); + transform: translateY(250px); } + .position-top.is-transition-push::after { + position: absolute; + bottom: 0; + left: 0; + height: 1px; + width: 100%; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-top.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-bottom { + bottom: 0; + left: 0; + width: 100%; + height: 250px; + -ms-transform: translateY(250px); + transform: translateY(250px); + overflow-x: auto; } + .position-bottom.is-open ~ .off-canvas-content { + -ms-transform: translateY(-250px); + transform: translateY(-250px); } + .position-bottom.is-transition-push::after { + position: absolute; + top: 0; + left: 0; + height: 1px; + width: 100%; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-bottom.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.off-canvas-content { + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +@media print, screen and (min-width: 40em) { + .position-left.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-left.reveal-for-medium ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-right.reveal-for-medium ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-top.reveal-for-medium ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-bottom.reveal-for-medium ~ .off-canvas-content { + margin-bottom: 250px; } } + +@media print, screen and (min-width: 64em) { + .position-left.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-left.reveal-for-large ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-right.reveal-for-large ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-top.reveal-for-large ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-bottom.reveal-for-large ~ .off-canvas-content { + margin-bottom: 250px; } } + +.orbit { + position: relative; } + +.orbit-container { + position: relative; + height: 0; + margin: 0; + list-style: none; + overflow: hidden; } + +.orbit-slide { + width: 100%; } + .orbit-slide.no-motionui.is-active { + top: 0; + left: 0; } + +.orbit-figure { + margin: 0; } + +.orbit-image { + width: 100%; + max-width: 100%; + margin: 0; } + +.orbit-caption { + position: absolute; + bottom: 0; + width: 100%; + margin-bottom: 0; + padding: 1rem; + background-color: rgba(10, 10, 10, 0.5); + color: #fefefe; } + +.orbit-previous, .orbit-next { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); + z-index: 10; + padding: 1rem; + color: #fefefe; } + [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { + outline: 0; } + .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); } + +.orbit-previous { + left: 0; } + +.orbit-next { + left: auto; + right: 0; } + +.orbit-bullets { + position: relative; + margin-top: 0.8rem; + margin-bottom: 0.8rem; + text-align: center; } + [data-whatinput='mouse'] .orbit-bullets { + outline: 0; } + .orbit-bullets button { + width: 1.2rem; + height: 1.2rem; + margin: 0.1rem; + border-radius: 50%; + background-color: #cacaca; } + .orbit-bullets button:hover { + background-color: #8a8a8a; } + .orbit-bullets button.is-active { + background-color: #8a8a8a; } + +.pagination { + margin-left: 0; + margin-bottom: 1rem; } + .pagination::before, .pagination::after { + display: table; + content: ' '; } + .pagination::after { + clear: both; } + .pagination li { + margin-right: 0.0625rem; + border-radius: 0; + font-size: 0.875rem; + display: none; } + .pagination li:last-child, .pagination li:first-child { + display: inline-block; } + @media print, screen and (min-width: 40em) { + .pagination li { + display: inline-block; } } + .pagination a, + .pagination button { + display: block; + padding: 0.1875rem 0.625rem; + border-radius: 0; + color: #0a0a0a; } + .pagination a:hover, + .pagination button:hover { + background: #e6e6e6; } + .pagination .current { + padding: 0.1875rem 0.625rem; + background: #1779ba; + color: #fefefe; + cursor: default; } + .pagination .disabled { + padding: 0.1875rem 0.625rem; + color: #cacaca; + cursor: not-allowed; } + .pagination .disabled:hover { + background: transparent; } + .pagination .ellipsis::after { + padding: 0.1875rem 0.625rem; + content: '\2026'; + color: #0a0a0a; } + +.pagination-previous a::before, +.pagination-previous.disabled::before { + display: inline-block; + margin-right: 0.5rem; + content: '\00ab'; } + +.pagination-next a::after, +.pagination-next.disabled::after { + display: inline-block; + margin-left: 0.5rem; + content: '\00bb'; } + +.progress { + height: 1rem; + margin-bottom: 1rem; + border-radius: 0; + background-color: #cacaca; } + .progress.primary .progress-meter { + background-color: #1779ba; } + .progress.secondary .progress-meter { + background-color: #767676; } + .progress.success .progress-meter { + background-color: #3adb76; } + .progress.warning .progress-meter { + background-color: #ffae00; } + .progress.alert .progress-meter { + background-color: #cc4b37; } + +.progress-meter { + position: relative; + display: block; + width: 0%; + height: 100%; + background-color: #1779ba; } + +.progress-meter-text { + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + position: absolute; + margin: 0; + font-size: 0.75rem; + font-weight: bold; + color: #fefefe; + white-space: nowrap; } + +body.is-reveal-open { + overflow: hidden; } + +html.is-reveal-open, +html.is-reveal-open body { + min-height: 100%; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.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; } + +.reveal { + z-index: 1006; + -webkit-backface-visibility: hidden; + 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; } + [data-whatinput='mouse'] .reveal { + outline: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + min-height: 0; } } + .reveal .column, .reveal .columns, + .reveal .columns { + min-width: 0; } + .reveal > :last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + width: 600px; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal .reveal { + right: auto; + left: auto; + margin: 0 auto; } } + .reveal.collapse { + padding: 0; } + @media print, screen and (min-width: 40em) { + .reveal.tiny { + width: 30%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.small { + width: 50%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.large { + width: 90%; + max-width: 75rem; } } + .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) { + .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; } } + .reveal.without-overlay { + position: fixed; } + +.slider { + position: relative; + height: 0.5rem; + margin-top: 1.25rem; + margin-bottom: 2.25rem; + background-color: #e6e6e6; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: none; + touch-action: none; } + +.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; } + .slider-fill.is-dragging { + transition: all 0s linear; } + +.slider-handle { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); + position: absolute; + 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; + -ms-touch-action: manipulation; + touch-action: manipulation; } + [data-whatinput='mouse'] .slider-handle { + outline: 0; } + .slider-handle:hover { + background-color: #14679e; } + .slider-handle.is-dragging { + transition: all 0s linear; } + +.slider.disabled, +.slider[disabled] { + opacity: 0.25; + cursor: not-allowed; } + +.slider.vertical { + display: inline-block; + width: 0.5rem; + height: 12.5rem; + margin: 0 1.25rem; + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + .slider.vertical .slider-fill { + top: 0; + width: 0.5rem; + max-height: 100%; } + .slider.vertical .slider-handle { + position: absolute; + top: 0; + left: 50%; + width: 1.4rem; + height: 1.4rem; + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + +.sticky-container { + position: relative; } + +.sticky { + position: relative; + z-index: 0; + transform: translate3d(0, 0, 0); } + +.sticky.is-stuck { + position: fixed; + z-index: 5; } + .sticky.is-stuck.is-at-top { + top: 0; } + .sticky.is-stuck.is-at-bottom { + bottom: 0; } + +.sticky.is-anchored { + position: relative; + right: auto; + left: auto; } + .sticky.is-anchored.is-at-bottom { + bottom: 0; } + +.switch { + height: 2rem; + position: relative; + margin-bottom: 1rem; + outline: 0; + font-size: 0.875rem; + font-weight: bold; + color: #fefefe; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.switch-input { + position: absolute; + margin-bottom: 0; + opacity: 0; } + +.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; } + input + .switch-paddle { + margin: 0; } + .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: ''; } + input:checked ~ .switch-paddle { + background: #1779ba; } + input:checked ~ .switch-paddle::after { + left: 2.25rem; } + [data-whatinput='mouse'] input:focus ~ .switch-paddle { + outline: 0; } + +.switch-active, .switch-inactive { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.switch-active { + left: 8%; + display: none; } + input:checked + label > .switch-active { + display: block; } + +.switch-inactive { + right: 15%; } + input:checked + label > .switch-inactive { + display: none; } + +.switch.tiny { + height: 1.5rem; } + .switch.tiny .switch-paddle { + width: 3rem; + height: 1.5rem; + font-size: 0.625rem; } + .switch.tiny .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1rem; + height: 1rem; } + .switch.tiny input:checked ~ .switch-paddle::after { + left: 1.75rem; } + +.switch.small { + height: 1.75rem; } + .switch.small .switch-paddle { + width: 3.5rem; + height: 1.75rem; + font-size: 0.75rem; } + .switch.small .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1.25rem; + height: 1.25rem; } + .switch.small input:checked ~ .switch-paddle::after { + left: 2rem; } + +.switch.large { + height: 2.5rem; } + .switch.large .switch-paddle { + width: 5rem; + height: 2.5rem; + font-size: 1rem; } + .switch.large .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 2rem; + height: 2rem; } + .switch.large input:checked ~ .switch-paddle::after { + left: 2.75rem; } + +table { + width: 100%; + margin-bottom: 1rem; + border-radius: 0; } + table thead, + table tbody, + table tfoot { + border: 1px solid #f1f1f1; + background-color: #fefefe; } + table caption { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; } + table thead { + background: #f8f8f8; + color: #0a0a0a; } + table tfoot { + background: #f1f1f1; + color: #0a0a0a; } + table thead tr, + table tfoot tr { + background: transparent; } + table thead th, + table thead td, + table tfoot th, + table tfoot td { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; + text-align: left; } + table tbody th, + table tbody td { + padding: 0.5rem 0.625rem 0.625rem; } + table tbody tr:nth-child(even) { + border-bottom: 0; + background-color: #f1f1f1; } + table.unstriped tbody { + background-color: #fefefe; } + table.unstriped tbody tr { + border-bottom: 0; + border-bottom: 1px solid #f1f1f1; + background-color: #fefefe; } + +@media screen and (max-width: 63.9375em) { + table.stack thead { + display: none; } + table.stack tfoot { + display: none; } + table.stack tr, + table.stack th, + table.stack td { + display: block; } + table.stack td { + border-top: 0; } } + +table.scroll { + display: block; + width: 100%; + overflow-x: auto; } + +table.hover thead tr:hover { + background-color: #f3f3f3; } + +table.hover tfoot tr:hover { + background-color: #ececec; } + +table.hover tbody tr:hover { + background-color: #f9f9f9; } + +table.hover:not(.unstriped) tr:nth-of-type(even):hover { + background-color: #ececec; } + +.table-scroll { + overflow-x: auto; } + .table-scroll table { + width: auto; } + +.tabs { + margin: 0; + border: 1px solid #e6e6e6; + background: #fefefe; + list-style-type: none; } + .tabs::before, .tabs::after { + display: table; + content: ' '; } + .tabs::after { + clear: both; } + +.tabs.vertical > li { + display: block; + float: none; + width: auto; } + +.tabs.simple > li > a { + padding: 0; } + .tabs.simple > li > a:hover { + background: transparent; } + +.tabs.primary { + background: #1779ba; } + .tabs.primary > li > a { + color: #fefefe; } + .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { + background: #1673b1; } + +.tabs-title { + float: left; } + .tabs-title > a { + display: block; + padding: 1.25rem 1.5rem; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; } + .tabs-title > a:hover { + background: #fefefe; + color: #1468a0; } + .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { + background: #e6e6e6; + color: #1779ba; } + +.tabs-content { + border: 1px solid #e6e6e6; + border-top: 0; + background: #fefefe; + color: #0a0a0a; + transition: all 0.5s ease; } + +.tabs-content.vertical { + border: 1px solid #e6e6e6; + border-left: 0; } + +.tabs-panel { + display: none; + padding: 1rem; } + .tabs-panel[aria-hidden="false"] { + display: block; } + +.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; } + +a.thumbnail { + transition: box-shadow 200ms ease-out; } + a.thumbnail:hover, a.thumbnail:focus { + box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); } + a.thumbnail image { + box-shadow: none; } + +.title-bar { + padding: 0.5rem; + background: #0a0a0a; + color: #fefefe; } + .title-bar::before, .title-bar::after { + display: table; + content: ' '; } + .title-bar::after { + clear: both; } + .title-bar .menu-icon { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.title-bar-left { + float: left; } + +.title-bar-right { + float: right; + text-align: right; } + +.title-bar-title { + display: inline-block; + vertical-align: middle; + font-weight: bold; } + +.has-tip { + position: relative; + display: inline-block; + border-bottom: dotted 1px #8a8a8a; + font-weight: bold; + cursor: help; } + +.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; } + .tooltip::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; + position: absolute; + bottom: 100%; + left: 50%; + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + .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; } + .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; + top: 50%; + bottom: auto; + left: 100%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + .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; + top: 50%; + right: 100%; + bottom: auto; + left: auto; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.top-bar { + padding: 0.5rem; } + .top-bar::before, .top-bar::after { + display: table; + content: ' '; } + .top-bar::after { + clear: both; } + .top-bar, + .top-bar ul { + background-color: #e6e6e6; } + .top-bar input { + max-width: 200px; + margin-right: 1rem; } + .top-bar .input-group-field { + width: 100%; + margin-right: 0; } + .top-bar input.button { + width: auto; } + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: 100%; } + @media print, screen and (min-width: 40em) { + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: auto; } } + @media screen and (max-width: 63.9375em) { + .top-bar.stacked-for-medium .top-bar-left, + .top-bar.stacked-for-medium .top-bar-right { + width: 100%; } } + @media screen and (max-width: 74.9375em) { + .top-bar.stacked-for-large .top-bar-left, + .top-bar.stacked-for-large .top-bar-right { + width: 100%; } } + +.top-bar-title { + display: inline-block; + float: left; + padding: 0.5rem 1rem 0.5rem 0; } + .top-bar-title .menu-icon { + bottom: 2px; } + +.top-bar-left { + float: left; } + +.top-bar-right { + float: right; } + +.hide { + display: none !important; } + +.invisible { + visibility: hidden; } + +@media screen and (max-width: 39.9375em) { + .hide-for-small-only { + display: none !important; } } + +@media screen and (max-width: 0em), screen and (min-width: 40em) { + .show-for-small-only { + display: none !important; } } + +@media print, screen and (min-width: 40em) { + .hide-for-medium { + display: none !important; } } + +@media screen and (max-width: 39.9375em) { + .show-for-medium { + display: none !important; } } + +@media screen and (min-width: 40em) and (max-width: 63.9375em) { + .hide-for-medium-only { + display: none !important; } } + +@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { + .show-for-medium-only { + display: none !important; } } + +@media print, screen and (min-width: 64em) { + .hide-for-large { + display: none !important; } } + +@media screen and (max-width: 63.9375em) { + .show-for-large { + display: none !important; } } + +@media screen and (min-width: 64em) and (max-width: 74.9375em) { + .hide-for-large-only { + display: none !important; } } + +@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { + .show-for-large-only { + display: none !important; } } + +.show-for-sr, +.show-on-focus { + position: absolute !important; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); } + +.show-on-focus:active, .show-on-focus:focus { + position: static !important; + width: auto; + height: auto; + overflow: visible; + clip: auto; } + +.show-for-landscape, +.hide-for-portrait { + display: block !important; } + @media screen and (orientation: landscape) { + .show-for-landscape, + .hide-for-portrait { + display: block !important; } } + @media screen and (orientation: portrait) { + .show-for-landscape, + .hide-for-portrait { + display: none !important; } } + +.hide-for-landscape, +.show-for-portrait { + display: none !important; } + @media screen and (orientation: landscape) { + .hide-for-landscape, + .show-for-portrait { + display: none !important; } } + @media screen and (orientation: portrait) { + .hide-for-landscape, + .show-for-portrait { + display: block !important; } } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-center { + display: block; + margin-right: auto; + margin-left: auto; } + +.clearfix::before, .clearfix::after { + display: table; + content: ' '; } + +.clearfix::after { + clear: both; } + +.slide-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(-100%); + transform: translateY(-100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-down.mui-enter.mui-enter-active { + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(-100%); + transform: translateX(-100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-left.mui-enter.mui-enter-active { + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(100%); + transform: translateY(100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-up.mui-enter.mui-enter-active { + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(100%); + transform: translateX(100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-right.mui-enter.mui-enter-active { + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-down.mui-leave.mui-leave-active { + -ms-transform: translateY(100%); + transform: translateY(100%); } + +.slide-out-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-right.mui-leave.mui-leave-active { + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.slide-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-up.mui-leave.mui-leave-active { + -ms-transform: translateY(-100%); + transform: translateY(-100%); } + +.slide-out-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-left.mui-leave.mui-leave-active { + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + +.fade-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 0; + transition-property: opacity; } + +.fade-in.mui-enter.mui-enter-active { + opacity: 1; } + +.fade-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 1; + transition-property: opacity; } + +.fade-out.mui-leave.mui-leave-active { + opacity: 0; } + +.hinge-in-from-top.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + -ms-transform-origin: top; + transform-origin: top; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-top.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + -ms-transform-origin: right; + transform-origin: right; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-right.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-bottom.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(90deg); + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-bottom.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(90deg); + -ms-transform-origin: left; + transform-origin: left; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-left.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-x.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-x.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-y.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-y.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-out-from-top.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: top; + transform-origin: top; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-top.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: right; + transform-origin: right; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-right.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.hinge-out-from-bottom.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-bottom.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(90deg); + opacity: 0; } + +.hinge-out-from-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: left; + transform-origin: left; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-left.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(90deg); + opacity: 0; } + +.hinge-out-from-middle-x.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-x.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-middle-y.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-y.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.scale-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(0.5); + transform: scale(0.5); + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-up.mui-enter.mui-enter-active { + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1.5); + transform: scale(1.5); + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-down.mui-enter.mui-enter-active { + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1); + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-up.mui-leave.mui-leave-active { + -ms-transform: scale(1.5); + transform: scale(1.5); + opacity: 0; } + +.scale-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1); + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-down.mui-leave.mui-leave-active { + -ms-transform: scale(0.5); + transform: scale(0.5); + opacity: 0; } + +.spin-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + transition-property: transform, opacity; + opacity: 0; } + +.spin-in.mui-enter.mui-enter-active { + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; } + +.spin-out.mui-leave.mui-leave-active { + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + opacity: 0; } + +.spin-in-ccw.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + transition-property: transform, opacity; + opacity: 0; } + +.spin-in-ccw.mui-enter.mui-enter-active { + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out-ccw.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; } + +.spin-out-ccw.mui-leave.mui-leave-active { + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + opacity: 0; } + +.slow { + transition-duration: 750ms !important; } + +.fast { + transition-duration: 250ms !important; } + +.linear { + transition-timing-function: linear !important; } + +.ease { + transition-timing-function: ease !important; } + +.ease-in { + transition-timing-function: ease-in !important; } + +.ease-out { + transition-timing-function: ease-out !important; } + +.ease-in-out { + transition-timing-function: ease-in-out !important; } + +.bounce-in { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + transition-delay: 300ms !important; } + +.long-delay { + transition-delay: 700ms !important; } + +.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%); } } + +.spin-cw { + animation-name: spin-cw-1turn; } + +@keyframes spin-cw-1turn { + 0% { + transform: rotate(-1turn); } + 100% { + transform: rotate(0); } } + +.spin-ccw { + animation-name: spin-cw-1turn; } + +@keyframes spin-cw-1turn { + 0% { + transform: rotate(0); } + 100% { + transform: rotate(1turn); } } + +.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); } } + +.shake, +.spin-cw, +.spin-ccw, +.wiggle { + animation-duration: 500ms; } + +.infinite { + animation-iteration-count: infinite; } + +.slow { + animation-duration: 750ms !important; } + +.fast { + animation-duration: 250ms !important; } + +.linear { + animation-timing-function: linear !important; } + +.ease { + animation-timing-function: ease !important; } + +.ease-in { + animation-timing-function: ease-in !important; } + +.ease-out { + animation-timing-function: ease-out !important; } + +.ease-in-out { + animation-timing-function: ease-in-out !important; } + +.bounce-in { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + animation-delay: 300ms !important; } + +.long-delay { + animation-delay: 700ms !important; } diff --git a/app/assets/stylesheets/css/foundation.min.css b/app/assets/stylesheets/css/foundation.min.css new file mode 100644 index 0000000000..34ff612eb3 --- /dev/null +++ b/app/assets/stylesheets/css/foundation.min.css @@ -0,0 +1,2 @@ +@charset "UTF-8"; +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}main{display:block}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}input{overflow:visible}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}details{display:block}summary{display:list-item}menu{display:block}canvas{display:inline-block}[hidden],template{display:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{box-sizing:border-box;font-size:100%}*,:after,:before{box-sizing:inherit}body{margin:0;padding:0;background:#fefefe;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;color:#0a0a0a;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}textarea{height:auto;min-height:50px;border-radius:0}select{box-sizing:border-box;width:100%;border-radius:0}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;border-radius:0;background:transparent;line-height:1}[data-whatinput=mouse] button{outline:0}pre{overflow:auto}.is-visible{display:block!important}.is-hidden{display:none!important}.row{max-width:75rem;margin-right:auto;margin-left:auto}.row:after,.row:before{display:table;content:" "}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-right:0;padding-left:0}.row .row{margin-right:-.625rem;margin-left:-.625rem}@media print,screen and (min-width:40em){.row .row{margin-right:-.9375rem;margin-left:-.9375rem}}@media print,screen and (min-width:64em){.row .row{margin-right:-.9375rem;margin-left:-.9375rem}}.row .row.collapse{margin-right:0;margin-left:0}.row.expanded{max-width:none}.row.expanded .row{margin-right:auto;margin-left:auto}.row:not(.expanded) .row{max-width:none}.row.gutter-small>.column,.row.gutter-small>.columns{padding-right:.625rem;padding-left:.625rem}.row.gutter-medium>.column,.row.gutter-medium>.columns{padding-right:.9375rem;padding-left:.9375rem}.column,.columns{width:100%;float:left;padding-right:.625rem;padding-left:.625rem}@media print,screen and (min-width:40em){.column,.columns{padding-right:.9375rem;padding-left:.9375rem}}.column:last-child:not(:first-child),.columns:last-child:not(:first-child){float:right}.column.end:last-child:last-child,.end.columns:last-child:last-child{float:left}.column.row.row,.row.row.columns{float:none}.row .column.row.row,.row .row.row.columns{margin-right:0;margin-left:0;padding-right:0;padding-left:0}.small-1{width:8.33333%}.small-push-1{position:relative;left:8.33333%}.small-pull-1{position:relative;left:-8.33333%}.small-offset-0{margin-left:0}.small-2{width:16.66667%}.small-push-2{position:relative;left:16.66667%}.small-pull-2{position:relative;left:-16.66667%}.small-offset-1{margin-left:8.33333%}.small-3{width:25%}.small-push-3{position:relative;left:25%}.small-pull-3{position:relative;left:-25%}.small-offset-2{margin-left:16.66667%}.small-4{width:33.33333%}.small-push-4{position:relative;left:33.33333%}.small-pull-4{position:relative;left:-33.33333%}.small-offset-3{margin-left:25%}.small-5{width:41.66667%}.small-push-5{position:relative;left:41.66667%}.small-pull-5{position:relative;left:-41.66667%}.small-offset-4{margin-left:33.33333%}.small-6{width:50%}.small-push-6{position:relative;left:50%}.small-pull-6{position:relative;left:-50%}.small-offset-5{margin-left:41.66667%}.small-7{width:58.33333%}.small-push-7{position:relative;left:58.33333%}.small-pull-7{position:relative;left:-58.33333%}.small-offset-6{margin-left:50%}.small-8{width:66.66667%}.small-push-8{position:relative;left:66.66667%}.small-pull-8{position:relative;left:-66.66667%}.small-offset-7{margin-left:58.33333%}.small-9{width:75%}.small-push-9{position:relative;left:75%}.small-pull-9{position:relative;left:-75%}.small-offset-8{margin-left:66.66667%}.small-10{width:83.33333%}.small-push-10{position:relative;left:83.33333%}.small-pull-10{position:relative;left:-83.33333%}.small-offset-9{margin-left:75%}.small-11{width:91.66667%}.small-push-11{position:relative;left:91.66667%}.small-pull-11{position:relative;left:-91.66667%}.small-offset-10{margin-left:83.33333%}.small-12{width:100%}.small-offset-11{margin-left:91.66667%}.small-up-1>.column,.small-up-1>.columns{float:left;width:100%}.small-up-1>.column:nth-of-type(1n),.small-up-1>.columns:nth-of-type(1n){clear:none}.small-up-1>.column:nth-of-type(1n+1),.small-up-1>.columns:nth-of-type(1n+1){clear:both}.small-up-1>.column:last-child,.small-up-1>.columns:last-child{float:left}.small-up-2>.column,.small-up-2>.columns{float:left;width:50%}.small-up-2>.column:nth-of-type(1n),.small-up-2>.columns:nth-of-type(1n){clear:none}.small-up-2>.column:nth-of-type(2n+1),.small-up-2>.columns:nth-of-type(2n+1){clear:both}.small-up-2>.column:last-child,.small-up-2>.columns:last-child{float:left}.small-up-3>.column,.small-up-3>.columns{float:left;width:33.33333%}.small-up-3>.column:nth-of-type(1n),.small-up-3>.columns:nth-of-type(1n){clear:none}.small-up-3>.column:nth-of-type(3n+1),.small-up-3>.columns:nth-of-type(3n+1){clear:both}.small-up-3>.column:last-child,.small-up-3>.columns:last-child{float:left}.small-up-4>.column,.small-up-4>.columns{float:left;width:25%}.small-up-4>.column:nth-of-type(1n),.small-up-4>.columns:nth-of-type(1n){clear:none}.small-up-4>.column:nth-of-type(4n+1),.small-up-4>.columns:nth-of-type(4n+1){clear:both}.small-up-4>.column:last-child,.small-up-4>.columns:last-child{float:left}.small-up-5>.column,.small-up-5>.columns{float:left;width:20%}.small-up-5>.column:nth-of-type(1n),.small-up-5>.columns:nth-of-type(1n){clear:none}.small-up-5>.column:nth-of-type(5n+1),.small-up-5>.columns:nth-of-type(5n+1){clear:both}.small-up-5>.column:last-child,.small-up-5>.columns:last-child{float:left}.small-up-6>.column,.small-up-6>.columns{float:left;width:16.66667%}.small-up-6>.column:nth-of-type(1n),.small-up-6>.columns:nth-of-type(1n){clear:none}.small-up-6>.column:nth-of-type(6n+1),.small-up-6>.columns:nth-of-type(6n+1){clear:both}.small-up-6>.column:last-child,.small-up-6>.columns:last-child{float:left}.small-up-7>.column,.small-up-7>.columns{float:left;width:14.28571%}.small-up-7>.column:nth-of-type(1n),.small-up-7>.columns:nth-of-type(1n){clear:none}.small-up-7>.column:nth-of-type(7n+1),.small-up-7>.columns:nth-of-type(7n+1){clear:both}.small-up-7>.column:last-child,.small-up-7>.columns:last-child{float:left}.small-up-8>.column,.small-up-8>.columns{float:left;width:12.5%}.small-up-8>.column:nth-of-type(1n),.small-up-8>.columns:nth-of-type(1n){clear:none}.small-up-8>.column:nth-of-type(8n+1),.small-up-8>.columns:nth-of-type(8n+1){clear:both}.small-up-8>.column:last-child,.small-up-8>.columns:last-child{float:left}.small-collapse>.column,.small-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .small-collapse.row,.small-collapse .row{margin-right:0;margin-left:0}.small-uncollapse>.column,.small-uncollapse>.columns{padding-right:.625rem;padding-left:.625rem}.small-centered{margin-right:auto;margin-left:auto}.small-centered,.small-centered:last-child:not(:first-child){float:none;clear:both}.small-pull-0,.small-push-0,.small-uncentered{position:static;float:left;margin-right:0;margin-left:0}@media print,screen and (min-width:40em){.medium-1{width:8.33333%}.medium-push-1{position:relative;left:8.33333%}.medium-pull-1{position:relative;left:-8.33333%}.medium-offset-0{margin-left:0}.medium-2{width:16.66667%}.medium-push-2{position:relative;left:16.66667%}.medium-pull-2{position:relative;left:-16.66667%}.medium-offset-1{margin-left:8.33333%}.medium-3{width:25%}.medium-push-3{position:relative;left:25%}.medium-pull-3{position:relative;left:-25%}.medium-offset-2{margin-left:16.66667%}.medium-4{width:33.33333%}.medium-push-4{position:relative;left:33.33333%}.medium-pull-4{position:relative;left:-33.33333%}.medium-offset-3{margin-left:25%}.medium-5{width:41.66667%}.medium-push-5{position:relative;left:41.66667%}.medium-pull-5{position:relative;left:-41.66667%}.medium-offset-4{margin-left:33.33333%}.medium-6{width:50%}.medium-push-6{position:relative;left:50%}.medium-pull-6{position:relative;left:-50%}.medium-offset-5{margin-left:41.66667%}.medium-7{width:58.33333%}.medium-push-7{position:relative;left:58.33333%}.medium-pull-7{position:relative;left:-58.33333%}.medium-offset-6{margin-left:50%}.medium-8{width:66.66667%}.medium-push-8{position:relative;left:66.66667%}.medium-pull-8{position:relative;left:-66.66667%}.medium-offset-7{margin-left:58.33333%}.medium-9{width:75%}.medium-push-9{position:relative;left:75%}.medium-pull-9{position:relative;left:-75%}.medium-offset-8{margin-left:66.66667%}.medium-10{width:83.33333%}.medium-push-10{position:relative;left:83.33333%}.medium-pull-10{position:relative;left:-83.33333%}.medium-offset-9{margin-left:75%}.medium-11{width:91.66667%}.medium-push-11{position:relative;left:91.66667%}.medium-pull-11{position:relative;left:-91.66667%}.medium-offset-10{margin-left:83.33333%}.medium-12{width:100%}.medium-offset-11{margin-left:91.66667%}.medium-up-1>.column,.medium-up-1>.columns{float:left;width:100%}.medium-up-1>.column:nth-of-type(1n),.medium-up-1>.columns:nth-of-type(1n){clear:none}.medium-up-1>.column:nth-of-type(1n+1),.medium-up-1>.columns:nth-of-type(1n+1){clear:both}.medium-up-1>.column:last-child,.medium-up-1>.columns:last-child{float:left}.medium-up-2>.column,.medium-up-2>.columns{float:left;width:50%}.medium-up-2>.column:nth-of-type(1n),.medium-up-2>.columns:nth-of-type(1n){clear:none}.medium-up-2>.column:nth-of-type(2n+1),.medium-up-2>.columns:nth-of-type(2n+1){clear:both}.medium-up-2>.column:last-child,.medium-up-2>.columns:last-child{float:left}.medium-up-3>.column,.medium-up-3>.columns{float:left;width:33.33333%}.medium-up-3>.column:nth-of-type(1n),.medium-up-3>.columns:nth-of-type(1n){clear:none}.medium-up-3>.column:nth-of-type(3n+1),.medium-up-3>.columns:nth-of-type(3n+1){clear:both}.medium-up-3>.column:last-child,.medium-up-3>.columns:last-child{float:left}.medium-up-4>.column,.medium-up-4>.columns{float:left;width:25%}.medium-up-4>.column:nth-of-type(1n),.medium-up-4>.columns:nth-of-type(1n){clear:none}.medium-up-4>.column:nth-of-type(4n+1),.medium-up-4>.columns:nth-of-type(4n+1){clear:both}.medium-up-4>.column:last-child,.medium-up-4>.columns:last-child{float:left}.medium-up-5>.column,.medium-up-5>.columns{float:left;width:20%}.medium-up-5>.column:nth-of-type(1n),.medium-up-5>.columns:nth-of-type(1n){clear:none}.medium-up-5>.column:nth-of-type(5n+1),.medium-up-5>.columns:nth-of-type(5n+1){clear:both}.medium-up-5>.column:last-child,.medium-up-5>.columns:last-child{float:left}.medium-up-6>.column,.medium-up-6>.columns{float:left;width:16.66667%}.medium-up-6>.column:nth-of-type(1n),.medium-up-6>.columns:nth-of-type(1n){clear:none}.medium-up-6>.column:nth-of-type(6n+1),.medium-up-6>.columns:nth-of-type(6n+1){clear:both}.medium-up-6>.column:last-child,.medium-up-6>.columns:last-child{float:left}.medium-up-7>.column,.medium-up-7>.columns{float:left;width:14.28571%}.medium-up-7>.column:nth-of-type(1n),.medium-up-7>.columns:nth-of-type(1n){clear:none}.medium-up-7>.column:nth-of-type(7n+1),.medium-up-7>.columns:nth-of-type(7n+1){clear:both}.medium-up-7>.column:last-child,.medium-up-7>.columns:last-child{float:left}.medium-up-8>.column,.medium-up-8>.columns{float:left;width:12.5%}.medium-up-8>.column:nth-of-type(1n),.medium-up-8>.columns:nth-of-type(1n){clear:none}.medium-up-8>.column:nth-of-type(8n+1),.medium-up-8>.columns:nth-of-type(8n+1){clear:both}.medium-up-8>.column:last-child,.medium-up-8>.columns:last-child{float:left}.medium-collapse>.column,.medium-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .medium-collapse.row,.medium-collapse .row{margin-right:0;margin-left:0}.medium-uncollapse>.column,.medium-uncollapse>.columns{padding-right:.9375rem;padding-left:.9375rem}.medium-centered{margin-right:auto;margin-left:auto}.medium-centered,.medium-centered:last-child:not(:first-child){float:none;clear:both}.medium-pull-0,.medium-push-0,.medium-uncentered{position:static;float:left;margin-right:0;margin-left:0}}@media print,screen and (min-width:64em){.large-1{width:8.33333%}.large-push-1{position:relative;left:8.33333%}.large-pull-1{position:relative;left:-8.33333%}.large-offset-0{margin-left:0}.large-2{width:16.66667%}.large-push-2{position:relative;left:16.66667%}.large-pull-2{position:relative;left:-16.66667%}.large-offset-1{margin-left:8.33333%}.large-3{width:25%}.large-push-3{position:relative;left:25%}.large-pull-3{position:relative;left:-25%}.large-offset-2{margin-left:16.66667%}.large-4{width:33.33333%}.large-push-4{position:relative;left:33.33333%}.large-pull-4{position:relative;left:-33.33333%}.large-offset-3{margin-left:25%}.large-5{width:41.66667%}.large-push-5{position:relative;left:41.66667%}.large-pull-5{position:relative;left:-41.66667%}.large-offset-4{margin-left:33.33333%}.large-6{width:50%}.large-push-6{position:relative;left:50%}.large-pull-6{position:relative;left:-50%}.large-offset-5{margin-left:41.66667%}.large-7{width:58.33333%}.large-push-7{position:relative;left:58.33333%}.large-pull-7{position:relative;left:-58.33333%}.large-offset-6{margin-left:50%}.large-8{width:66.66667%}.large-push-8{position:relative;left:66.66667%}.large-pull-8{position:relative;left:-66.66667%}.large-offset-7{margin-left:58.33333%}.large-9{width:75%}.large-push-9{position:relative;left:75%}.large-pull-9{position:relative;left:-75%}.large-offset-8{margin-left:66.66667%}.large-10{width:83.33333%}.large-push-10{position:relative;left:83.33333%}.large-pull-10{position:relative;left:-83.33333%}.large-offset-9{margin-left:75%}.large-11{width:91.66667%}.large-push-11{position:relative;left:91.66667%}.large-pull-11{position:relative;left:-91.66667%}.large-offset-10{margin-left:83.33333%}.large-12{width:100%}.large-offset-11{margin-left:91.66667%}.large-up-1>.column,.large-up-1>.columns{float:left;width:100%}.large-up-1>.column:nth-of-type(1n),.large-up-1>.columns:nth-of-type(1n){clear:none}.large-up-1>.column:nth-of-type(1n+1),.large-up-1>.columns:nth-of-type(1n+1){clear:both}.large-up-1>.column:last-child,.large-up-1>.columns:last-child{float:left}.large-up-2>.column,.large-up-2>.columns{float:left;width:50%}.large-up-2>.column:nth-of-type(1n),.large-up-2>.columns:nth-of-type(1n){clear:none}.large-up-2>.column:nth-of-type(2n+1),.large-up-2>.columns:nth-of-type(2n+1){clear:both}.large-up-2>.column:last-child,.large-up-2>.columns:last-child{float:left}.large-up-3>.column,.large-up-3>.columns{float:left;width:33.33333%}.large-up-3>.column:nth-of-type(1n),.large-up-3>.columns:nth-of-type(1n){clear:none}.large-up-3>.column:nth-of-type(3n+1),.large-up-3>.columns:nth-of-type(3n+1){clear:both}.large-up-3>.column:last-child,.large-up-3>.columns:last-child{float:left}.large-up-4>.column,.large-up-4>.columns{float:left;width:25%}.large-up-4>.column:nth-of-type(1n),.large-up-4>.columns:nth-of-type(1n){clear:none}.large-up-4>.column:nth-of-type(4n+1),.large-up-4>.columns:nth-of-type(4n+1){clear:both}.large-up-4>.column:last-child,.large-up-4>.columns:last-child{float:left}.large-up-5>.column,.large-up-5>.columns{float:left;width:20%}.large-up-5>.column:nth-of-type(1n),.large-up-5>.columns:nth-of-type(1n){clear:none}.large-up-5>.column:nth-of-type(5n+1),.large-up-5>.columns:nth-of-type(5n+1){clear:both}.large-up-5>.column:last-child,.large-up-5>.columns:last-child{float:left}.large-up-6>.column,.large-up-6>.columns{float:left;width:16.66667%}.large-up-6>.column:nth-of-type(1n),.large-up-6>.columns:nth-of-type(1n){clear:none}.large-up-6>.column:nth-of-type(6n+1),.large-up-6>.columns:nth-of-type(6n+1){clear:both}.large-up-6>.column:last-child,.large-up-6>.columns:last-child{float:left}.large-up-7>.column,.large-up-7>.columns{float:left;width:14.28571%}.large-up-7>.column:nth-of-type(1n),.large-up-7>.columns:nth-of-type(1n){clear:none}.large-up-7>.column:nth-of-type(7n+1),.large-up-7>.columns:nth-of-type(7n+1){clear:both}.large-up-7>.column:last-child,.large-up-7>.columns:last-child{float:left}.large-up-8>.column,.large-up-8>.columns{float:left;width:12.5%}.large-up-8>.column:nth-of-type(1n),.large-up-8>.columns:nth-of-type(1n){clear:none}.large-up-8>.column:nth-of-type(8n+1),.large-up-8>.columns:nth-of-type(8n+1){clear:both}.large-up-8>.column:last-child,.large-up-8>.columns:last-child{float:left}.large-collapse>.column,.large-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .large-collapse.row,.large-collapse .row{margin-right:0;margin-left:0}.large-uncollapse>.column,.large-uncollapse>.columns{padding-right:.9375rem;padding-left:.9375rem}.large-centered{margin-right:auto;margin-left:auto}.large-centered,.large-centered:last-child:not(:first-child){float:none;clear:both}.large-pull-0,.large-push-0,.large-uncentered{position:static;float:left;margin-right:0;margin-left:0}}.column-block{margin-bottom:1.25rem}.column-block>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.column-block{margin-bottom:1.875rem}.column-block>:last-child{margin-bottom:0}}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{margin-bottom:1rem;font-size:inherit;line-height:1.6;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}h1,h2,h3,h4,h5,h6{font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;color:inherit;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{line-height:0;color:#cacaca}h1{font-size:1.5rem}h1,h2{line-height:1.4;margin-top:0;margin-bottom:.5rem}h2{font-size:1.25rem}h3{font-size:1.1875rem}h3,h4{line-height:1.4;margin-top:0;margin-bottom:.5rem}h4{font-size:1.125rem}h5{font-size:1.0625rem}h5,h6{line-height:1.4;margin-top:0;margin-bottom:.5rem}h6{font-size:1rem}@media print,screen and (min-width:40em){h1{font-size:3rem}h2{font-size:2.5rem}h3{font-size:1.9375rem}h4{font-size:1.5625rem}h5{font-size:1.25rem}h6{font-size:1rem}}a{line-height:inherit;color:#1779ba;text-decoration:none;cursor:pointer}a:focus,a:hover{color:#1468a0}a img{border:0}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}dl,ol,ul{margin-bottom:1rem;list-style-position:outside;line-height:1.6}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-left:1.25rem;margin-bottom:0}dl{margin-bottom:1rem}dl dt{margin-bottom:.3rem;font-weight:700}blockquote{margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #cacaca}blockquote,blockquote p{line-height:1.6;color:#8a8a8a}cite{display:block;font-size:.8125rem;color:#8a8a8a}cite:before{content:"— "}abbr{border-bottom:1px dotted #0a0a0a;color:#0a0a0a;cursor:help}figure{margin:0}code{padding:.125rem .3125rem .0625rem;border:1px solid #cacaca;font-weight:400}code,kbd{background-color:#e6e6e6;font-family:Consolas,Liberation Mono,Courier,monospace;color:#0a0a0a}kbd{margin:0;padding:.125rem .25rem 0}.subheader{margin-top:.2rem;margin-bottom:.5rem;font-weight:400;line-height:1.4;color:#8a8a8a}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}.no-bullet{margin-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:transparent!important;box-shadow:none!important;color:#000!important;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.button{display:inline-block;vertical-align:middle;margin:0 0 1rem;padding:.85em 1em;-webkit-appearance:none;border:1px solid transparent;border-radius:0;transition:background-color .25s ease-out,color .25s ease-out;font-size:.9rem;line-height:1;text-align:center;cursor:pointer;background-color:#1779ba;color:#fefefe}[data-whatinput=mouse] .button{outline:0}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;width:100%;margin-right:0;margin-left:0}.button.primary{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow{border:1px solid #1779ba;color:#1779ba}.button.hollow,.button.hollow:focus,.button.hollow:hover{background-color:transparent}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.disabled,.button[disabled]{opacity:.25;cursor:not-allowed}.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.disabled.primary,.button[disabled].primary{opacity:.25;cursor:not-allowed}.button.disabled.primary,.button.disabled.primary:focus,.button.disabled.primary:hover,.button[disabled].primary,.button[disabled].primary:focus,.button[disabled].primary:hover{background-color:#1779ba;color:#fefefe}.button.disabled.secondary,.button[disabled].secondary{opacity:.25;cursor:not-allowed}.button.disabled.secondary,.button.disabled.secondary:focus,.button.disabled.secondary:hover,.button[disabled].secondary,.button[disabled].secondary:focus,.button[disabled].secondary:hover{background-color:#767676;color:#fefefe}.button.disabled.success,.button[disabled].success{opacity:.25;cursor:not-allowed}.button.disabled.success,.button.disabled.success:focus,.button.disabled.success:hover,.button[disabled].success,.button[disabled].success:focus,.button[disabled].success:hover{background-color:#3adb76;color:#0a0a0a}.button.disabled.warning,.button[disabled].warning{opacity:.25;cursor:not-allowed}.button.disabled.warning,.button.disabled.warning:focus,.button.disabled.warning:hover,.button[disabled].warning,.button[disabled].warning:focus,.button[disabled].warning:hover{background-color:#ffae00;color:#0a0a0a}.button.disabled.alert,.button[disabled].alert{opacity:.25;cursor:not-allowed}.button.disabled.alert,.button.disabled.alert:focus,.button.disabled.alert:hover,.button[disabled].alert,.button[disabled].alert:focus,.button[disabled].alert:hover{background-color:#cc4b37;color:#fefefe}.button.dropdown:after{display:block;width:0;height:0;border:.4em inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#fefefe transparent transparent;position:relative;top:.4em;display:inline-block;float:right;margin-left:1em}.button.arrow-only:after{top:-.1em;float:none;margin-left:0}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{display:block;box-sizing:border-box;width:100%;height:2.4375rem;margin:0 0 1rem;padding:.5rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);font-family:inherit;font-size:1rem;font-weight:400;color:#0a0a0a;transition:box-shadow .5s,border-color .25s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}textarea{max-width:100%}textarea[rows]{height:auto}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#cacaca}input::-moz-placeholder,textarea::-moz-placeholder{color:#cacaca}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#cacaca}input::placeholder,textarea::placeholder{color:#cacaca}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{box-sizing:border-box}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;vertical-align:baseline;margin-left:.5rem;margin-right:1rem;margin-bottom:0}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{display:block;margin:0;font-size:.875rem;font-weight:400;line-height:1.8;color:#0a0a0a}label.middle{margin:0 0 1rem;padding:.5625rem 0}.help-text{margin-top:-.5rem;font-size:.8125rem;font-style:italic;color:#0a0a0a}.input-group{display:table;width:100%;margin-bottom:1rem}.input-group>:first-child,.input-group>:last-child>*{border-radius:0 0 0 0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap;display:table-cell;vertical-align:middle}.input-group-label{padding:0 1rem;border:1px solid #cacaca;background:#e6e6e6;color:#0a0a0a;text-align:center;white-space:nowrap;width:1%;height:100%}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{border-radius:0;height:2.5rem}.input-group-button{padding-top:0;padding-bottom:0;text-align:center;width:1%;height:100%}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{height:2.5rem;padding-top:0;padding-bottom:0;font-size:1rem}.input-group .input-group-button{display:table-cell}fieldset{margin:0;padding:0;border:0}legend{max-width:100%;margin-bottom:.5rem}.fieldset{margin:1.125rem 0;padding:1.25rem;border:1px solid #cacaca}.fieldset legend{margin:0;margin-left:-.1875rem;padding:0 .1875rem;background:#fefefe}select{height:2.4375rem;margin:0 0 1rem;padding:.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-family:inherit;font-size:1rem;line-height:normal;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 .5s,border-color .25s ease-in-out}@media screen and (min-width:0\0){select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==")}}select:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{height:auto;background-image:none}.is-invalid-input:not(:focus){border-color:#cc4b37;background-color:#f9ecea}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.form-error,.is-invalid-input:not(:focus)::placeholder,.is-invalid-label{color:#cc4b37}.form-error{display:none;margin-top:-.5rem;margin-bottom:1rem;font-size:.75rem;font-weight:700}.form-error.is-visible{display:block}.accordion{margin-left:0;background:#fefefe;list-style-type:none}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0 0 0 0}.accordion-title{position:relative;display:block;padding:1.25rem 1rem;border:1px solid #e6e6e6;border-bottom:0;font-size:.75rem;line-height:1;color:#1779ba}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0 0 0 0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{position:absolute;top:50%;right:1rem;margin-top:-.5rem;content:"+"}.is-active>.accordion-title:before{content:"\2013"}.accordion-content{display:none;padding:1rem;border:1px solid #e6e6e6;border-bottom:0;background-color:#fefefe;color:#0a0a0a}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.is-accordion-submenu-parent>a{position:relative}.is-accordion-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;position:absolute;top:50%;margin-top:-3px;right:1rem}.is-accordion-submenu-parent[aria-expanded=true]>a:after{transform:rotate(180deg);transform-origin:50% 50%}.badge{display:inline-block;min-width:2.1em;padding:.3em;border-radius:50%;font-size:.6rem;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{margin:0 0 1rem;list-style:none}.breadcrumbs:after,.breadcrumbs:before{display:table;content:" "}.breadcrumbs:after{clear:both}.breadcrumbs li{float:left;font-size:.6875rem;color:#0a0a0a;cursor:default;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{position:relative;top:1px;margin:0 .75rem;opacity:1;content:"/";color:#cacaca}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.button-group{margin-bottom:1rem;font-size:0}.button-group:after,.button-group:before{display:table;content:" "}.button-group:after{clear:both}.button-group .button{margin:0;margin-right:1px;margin-bottom:1px;font-size:.9rem}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded{margin-right:-1px}.button-group.expanded:after,.button-group.expanded:before{display:none}.button-group.expanded .button:first-child:last-child{width:100%}.button-group.expanded .button:first-child:nth-last-child(2),.button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2)~.button{display:inline-block;width:calc(50% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(2):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(3),.button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3)~.button{display:inline-block;width:calc(33.33333% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(3):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(4),.button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4)~.button{display:inline-block;width:calc(25% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(4):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(5),.button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5)~.button{display:inline-block;width:calc(20% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(5):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(6),.button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6)~.button{display:inline-block;width:calc(16.66667% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(6):last-child{margin-right:-6px}.button-group.primary .button{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button,.button-group.stacked .button{width:100%}.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child,.button-group.stacked .button:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{width:auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{width:auto;margin-bottom:0}}@media screen and (max-width:39.9375em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}.card{margin-bottom:1rem;border:1px solid #e6e6e6;border-radius:0;background:#fefefe;box-shadow:none;overflow:hidden;color:#0a0a0a}.card>:last-child{margin-bottom:0}.card-divider{padding:1rem;background:#e6e6e6}.card-divider>:last-child{margin-bottom:0}.card-section{padding:1rem}.card-section>:last-child{margin-bottom:0}.callout{position:relative;margin:0 0 1rem;padding:1rem;border:1px solid hsla(0,0%,4%,.25);border-radius:0;background-color:#fff;color:#0a0a0a}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.close-button{position:absolute;color:#8a8a8a;cursor:pointer}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{right:.66rem;top:.33em;font-size:1.5em;line-height:1}.close-button,.close-button.medium{right:1rem;top:.5rem;font-size:2em;line-height:1}.menu{margin:0;list-style-type:none}.menu>li{display:table-cell;vertical-align:middle}[data-whatinput=mouse] .menu>li{outline:0}.menu>li>a{display:block;padding:.7rem 1rem;line-height:1}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu>li>a i,.menu>li>a i+span,.menu>li>a img,.menu>li>a img+span,.menu>li>a svg,.menu>li>a svg+span{vertical-align:middle}.menu>li>a i,.menu>li>a img,.menu>li>a svg{margin-right:.25rem;display:inline-block}.menu.horizontal>li,.menu>li{display:table-cell}.menu.expanded{display:table;width:100%;table-layout:fixed}.menu.expanded>li:first-child:last-child{width:100%}.menu.vertical>li{display:block}@media print,screen and (min-width:40em){.menu.medium-horizontal>li{display:table-cell}.menu.medium-expanded{display:table;width:100%;table-layout:fixed}.menu.medium-expanded>li:first-child:last-child{width:100%}.menu.medium-vertical>li{display:block}}@media print,screen and (min-width:64em){.menu.large-horizontal>li{display:table-cell}.menu.large-expanded{display:table;width:100%;table-layout:fixed}.menu.large-expanded>li:first-child:last-child{width:100%}.menu.large-vertical>li{display:block}}.menu.simple li{display:inline-block;vertical-align:top;line-height:1}.menu.simple a{padding:0}.menu.simple li{margin-left:0;margin-right:1rem}.menu.simple.align-right li{margin-right:0;margin-left:1rem}.menu.align-right:after,.menu.align-right:before{display:table;content:" "}.menu.align-right:after{clear:both}.menu.align-right>li{float:right}.menu.icon-top>li>a{text-align:center}.menu.icon-top>li>a i,.menu.icon-top>li>a img,.menu.icon-top>li>a svg{display:block;margin:0 auto .25rem}.menu.icon-top.vertical a>span{margin:auto}.menu.nested{margin-left:1rem}.menu .active>a{background:#1779ba;color:#fefefe}.menu.menu-bordered li{border:1px solid #e6e6e6}.menu.menu-bordered li:not(:first-child){border-top:0}.menu.menu-hover li:hover{background-color:#e6e6e6}.menu-text{padding-top:0;padding-bottom:0;padding:.7rem 1rem;font-weight:700;line-height:1;color:inherit}.menu-centered{text-align:center}.menu-centered>.menu{display:inline-block;vertical-align:top}.no-js [data-responsive-menu] ul{display:none}.menu-icon{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.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:""}.menu-icon:hover:after{background:#cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.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:""}.menu-icon.dark:hover:after{background:#8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.is-drilldown{position:relative;overflow:hidden}.is-drilldown li{display:block}.is-drilldown.animate-height{transition:height .5s}.is-drilldown-submenu{position:absolute;top:0;left:100%;z-index:-1;width:100%;background:#fefefe;transition:transform .15s linear}.is-drilldown-submenu.is-active{z-index:1;display:block;transform:translateX(-100%)}.is-drilldown-submenu.is-closing{transform:translateX(100%)}.drilldown-submenu-cover-previous{min-height:100%}.is-drilldown-submenu-parent>a{position:relative}.is-drilldown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba;position:absolute;top:50%;margin-top:-6px;right:1rem}.js-drilldown-back>a:before{display:block;width:0;height:0;border:6px inset;content:"";border-right-style:solid;border-color:transparent #1779ba transparent transparent;display:inline-block;vertical-align:middle;margin-right:.75rem;border-left-width:0}.dropdown-pane{position:absolute;z-index:10;display:block;width:300px;padding:1rem;visibility:hidden;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-size:1rem}.dropdown-pane.is-open{visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.dropdown.menu>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;margin-top:-3px}[data-whatinput=mouse] .dropdown.menu a{outline:0}.no-js .dropdown.menu ul{display:none}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;margin-top:-3px}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.medium-vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;margin-top:-3px}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.large-vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{top:100%;right:0;left:auto}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{position:absolute;top:50%;right:5px;margin-top:-6px}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{top:100%;left:auto}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{right:100%;left:auto}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{right:auto;left:100%}.is-dropdown-submenu{position:absolute;top:0;left:100%;z-index:1;display:none;min-width:200px;border:1px solid #cacaca;background:#fefefe}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.flex-video,.responsive-embed{position:relative;height:0;margin-bottom:1rem;padding-bottom:75%;overflow:hidden}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{position:absolute;top:0;left:0;width:100%;height:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.label{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.media-object{display:block;margin-bottom:1rem}.media-object img{max-width:none}@media screen and (max-width:39.9375em){.media-object.stack-for-small .media-object-section{padding:0;padding-bottom:1rem;display:block}.media-object.stack-for-small .media-object-section img{width:100%}}.media-object-section{display:table-cell;vertical-align:top}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}.media-object-section.middle{vertical-align:middle}.media-object-section.bottom{vertical-align:bottom}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{position:absolute;top:0;left:0;width:100%;height:100%;transition:opacity .5s ease,visibility .5s ease;background:hsla(0,0%,100%,.25);opacity:0;visibility:hidden;overflow:hidden}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{position:relative;overflow:hidden}.off-canvas{position:fixed;z-index:1;transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-overlap{z-index:10}.off-canvas.is-transition-overlap.is-open{box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{transform:translate(0)}.off-canvas-absolute{position:absolute;z-index:1;transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-overlap{z-index:10}.off-canvas-absolute.is-transition-overlap.is-open{box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{transform:translate(0)}.position-left{top:0;left:0;width:250px;height:100%;transform:translateX(-250px);overflow-y:auto}.position-left.is-open~.off-canvas-content{transform:translateX(250px)}.position-left.is-transition-push:after{position:absolute;top:0;right:0;height:100%;width:1px;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-left.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-right{top:0;right:0;width:250px;height:100%;transform:translateX(250px);overflow-y:auto}.position-right.is-open~.off-canvas-content{transform:translateX(-250px)}.position-right.is-transition-push:after{position:absolute;top:0;left:0;height:100%;width:1px;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-right.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-top{top:0;left:0;width:100%;height:250px;transform:translateY(-250px);overflow-x:auto}.position-top.is-open~.off-canvas-content{transform:translateY(250px)}.position-top.is-transition-push:after{position:absolute;bottom:0;left:0;height:1px;width:100%;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-top.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-bottom{bottom:0;left:0;width:100%;height:250px;transform:translateY(250px);overflow-x:auto}.position-bottom.is-open~.off-canvas-content{transform:translateY(-250px)}.position-bottom.is-transition-push:after{position:absolute;top:0;left:0;height:1px;width:100%;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-bottom.is-transition-overlap.is-open~.off-canvas-content{transform:none}.off-canvas-content{transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{transform:none;z-index:1}.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{transform:none;z-index:1}.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{transform:none;z-index:1}.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{transform:none;z-index:1}.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{transform:none;z-index:1}.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{transform:none;z-index:1}.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{transform:none;z-index:1}.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{transform:none;z-index:1}.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}.orbit,.orbit-container{position:relative}.orbit-container{height:0;margin:0;list-style:none;overflow:hidden}.orbit-slide{width:100%}.orbit-slide.no-motionui.is-active{top:0;left:0}.orbit-figure{margin:0}.orbit-image{width:100%;max-width:100%;margin:0}.orbit-caption{bottom:0;width:100%;margin-bottom:0;background-color:hsla(0,0%,4%,.5)}.orbit-caption,.orbit-next,.orbit-previous{position:absolute;padding:1rem;color:#fefefe}.orbit-next,.orbit-previous{top:50%;transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{position:relative;margin-top:.8rem;margin-bottom:.8rem;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{width:1.2rem;height:1.2rem;margin:.1rem;border-radius:50%;background-color:#cacaca}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.pagination{margin-left:0;margin-bottom:1rem}.pagination:after,.pagination:before{display:table;content:" "}.pagination:after{clear:both}.pagination li{margin-right:.0625rem;border-radius:0;font-size:.875rem;display:none}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{display:block;padding:.1875rem .625rem;border-radius:0;color:#0a0a0a}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{padding:.1875rem .625rem;background:#1779ba;color:#fefefe;cursor:default}.pagination .disabled{padding:.1875rem .625rem;color:#cacaca;cursor:not-allowed}.pagination .disabled:hover{background:transparent}.pagination .ellipsis:after{padding:.1875rem .625rem;content:"\2026";color:#0a0a0a}.pagination-previous.disabled:before,.pagination-previous a:before{display:inline-block;margin-right:.5rem;content:"\00ab"}.pagination-next.disabled:after,.pagination-next a:after{display:inline-block;margin-left:.5rem;content:"\00bb"}.progress{height:1rem;margin-bottom:1rem;border-radius:0;background-color:#cacaca}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{position:relative;display:block;width:0;height:100%;background-color:#1779ba}.progress-meter-text{top:50%;left:50%;transform:translate(-50%,-50%);position:absolute;margin:0;font-size:.75rem;font-weight:700;color:#fefefe;white-space:nowrap}body.is-reveal-open{overflow:hidden}html.is-reveal-open,html.is-reveal-open body{min-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reveal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1005;display:none;background-color:hsla(0,0%,4%,.45);overflow-y:scroll}.reveal{z-index:1006;-webkit-backface-visibility:hidden;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}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column,.reveal .columns{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{width:600px;max-width:75rem}}@media print,screen and (min-width:40em){.reveal .reveal{right:auto;left:auto;margin:0 auto}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{width:30%;max-width:75rem}}@media print,screen and (min-width:40em){.reveal.small{width:50%;max-width:75rem}}@media print,screen and (min-width:40em){.reveal.large{width:90%;max-width:75rem}}.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){.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}}.reveal.without-overlay{position:fixed}.slider{position:relative;height:.5rem;margin-top:1.25rem;margin-bottom:2.25rem;background-color:#e6e6e6;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:none;touch-action:none}.slider-fill{position:absolute;top:0;left:0;display:inline-block;max-width:100%;height:.5rem;background-color:#cacaca;transition:all .2s ease-in-out}.slider-fill.is-dragging{transition:all 0s linear}.slider-handle{top:50%;transform:translateY(-50%);position:absolute;left:0;z-index:1;display:inline-block;width:1.4rem;height:1.4rem;border-radius:0;background-color:#1779ba;transition:all .2s ease-in-out;-ms-touch-action:manipulation;touch-action:manipulation}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{transition:all 0s linear}.slider.disabled,.slider[disabled]{opacity:.25;cursor:not-allowed}.slider.vertical{display:inline-block;width:.5rem;height:12.5rem;margin:0 1.25rem;transform:scaleY(-1)}.slider.vertical .slider-fill{top:0;width:.5rem;max-height:100%}.slider.vertical .slider-handle{position:absolute;top:0;left:50%;width:1.4rem;height:1.4rem;transform:translateX(-50%)}.sticky,.sticky-container{position:relative}.sticky{z-index:0;transform:translateZ(0)}.sticky.is-stuck{position:fixed;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{position:relative;right:auto;left:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.switch{height:2rem;position:relative;margin-bottom:1rem;outline:0;font-size:.875rem;font-weight:700;color:#fefefe;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{position:absolute;margin-bottom:0;opacity:0}.switch-paddle{position:relative;display:block;width:4rem;height:2rem;border-radius:0;background:#cacaca;transition:all .25s ease-out;font-weight:inherit;color:inherit;cursor:pointer}input+.switch-paddle{margin:0}.switch-paddle:after{position:absolute;top:.25rem;left:.25rem;display:block;width:1.5rem;height:1.5rem;transform:translateZ(0);border-radius:0;background:#fefefe;transition:all .25s ease-out;content:""}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;transform:translateY(-50%)}.switch-active{left:8%;display:none}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{width:3rem;height:1.5rem;font-size:.625rem}.switch.tiny .switch-paddle:after{top:.25rem;left:.25rem;width:1rem;height:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{width:3.5rem;height:1.75rem;font-size:.75rem}.switch.small .switch-paddle:after{top:.25rem;left:.25rem;width:1.25rem;height:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{width:5rem;height:2.5rem;font-size:1rem}.switch.large .switch-paddle:after{top:.25rem;left:.25rem;width:2rem;height:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{width:100%;margin-bottom:1rem;border-radius:0}table tbody,table tfoot,table thead{border:1px solid #f1f1f1;background-color:#fefefe}table caption{padding:.5rem .625rem .625rem;font-weight:700}table thead{background:#f8f8f8;color:#0a0a0a}table tfoot{background:#f1f1f1;color:#0a0a0a}table tfoot tr,table thead tr{background:transparent}table tfoot td,table tfoot th,table thead td,table thead th{padding:.5rem .625rem .625rem;font-weight:700;text-align:left}table tbody td,table tbody th{padding:.5rem .625rem .625rem}table tbody tr:nth-child(even){border-bottom:0;background-color:#f1f1f1}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{border-bottom:0;border-bottom:1px solid #f1f1f1;background-color:#fefefe}@media screen and (max-width:63.9375em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;width:100%;overflow-x:auto}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(even):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.table-scroll table{width:auto}.tabs{margin:0;border:1px solid #e6e6e6;background:#fefefe;list-style-type:none}.tabs:after,.tabs:before{display:table;content:" "}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:transparent}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{display:block;padding:1.25rem 1.5rem;font-size:.75rem;line-height:1;color:#1779ba}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{border:1px solid #e6e6e6;border-top:0;background:#fefefe;color:#0a0a0a;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel[aria-hidden=false]{display:block}.thumbnail{display:inline-block;max-width:100%;margin-bottom:1rem;border:4px solid #fefefe;border-radius:0;box-shadow:0 0 0 1px hsla(0,0%,4%,.2);line-height:0}a.thumbnail{transition:box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{box-shadow:none}.title-bar{padding:.5rem;background:#0a0a0a;color:#fefefe}.title-bar:after,.title-bar:before{display:table;content:" "}.title-bar:after{clear:both}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left{float:left}.title-bar-right{float:right;text-align:right}.title-bar-title{vertical-align:middle}.has-tip,.title-bar-title{display:inline-block;font-weight:700}.has-tip{position:relative;border-bottom:1px dotted #8a8a8a;cursor:help}.tooltip{position:absolute;top:calc(100% + .6495rem);z-index:1200;max-width:10rem;padding:.75rem;border-radius:0;background-color:#0a0a0a;font-size:80%;color:#fefefe}.tooltip:before{border:.75rem inset;border-top-width:0;border-bottom-style:solid;border-color:transparent transparent #0a0a0a;position:absolute;bottom:100%;left:50%;transform:translateX(-50%)}.tooltip.top:before,.tooltip:before{display:block;width:0;height:0;content:""}.tooltip.top:before{border:.75rem inset;border-bottom-width:0;border-top-style:solid;border-color:#0a0a0a transparent transparent;top:100%;bottom:auto}.tooltip.left:before{border:.75rem inset;border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #0a0a0a;left:100%}.tooltip.left:before,.tooltip.right:before{display:block;width:0;height:0;content:"";top:50%;bottom:auto;transform:translateY(-50%)}.tooltip.right:before{border:.75rem inset;border-left-width:0;border-right-style:solid;border-color:transparent #0a0a0a transparent transparent;right:100%;left:auto}.top-bar{padding:.5rem}.top-bar:after,.top-bar:before{display:table;content:" "}.top-bar:after{clear:both}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{max-width:200px;margin-right:1rem}.top-bar .input-group-field{width:100%;margin-right:0}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{width:100%}@media print,screen and (min-width:40em){.top-bar .top-bar-left,.top-bar .top-bar-right{width:auto}}@media screen and (max-width:63.9375em){.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{width:100%}}@media screen and (max-width:74.9375em){.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{width:100%}}.top-bar-title{display:inline-block;float:left;padding:.5rem 1rem .5rem 0}.top-bar-title .menu-icon{bottom:2px}.top-bar-left{float:left}.top-bar-right{float:right}.hide{display:none!important}.invisible{visibility:hidden}@media screen and (max-width:39.9375em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.9375em){.show-for-medium{display:none!important}}@media screen and (min-width:40em) and (max-width:63.9375em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.9375em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.9375em){.show-for-large{display:none!important}}@media screen and (min-width:64em) and (max-width:74.9375em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.9375em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.show-on-focus:active,.show-on-focus:focus{position:static!important;width:auto;height:auto;overflow:visible;clip:auto}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-right:auto;margin-left:auto}.clearfix:after,.clearfix:before{display:table;content:" "}.clearfix:after{clear:both}.slide-in-down.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateY(-100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-down.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-left.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateX(-100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-left.mui-enter.mui-enter-active{transform:translateX(0)}.slide-in-up.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateY(100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-up.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-right.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateX(100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-right.mui-enter.mui-enter-active{transform:translateX(0)}.slide-out-down.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateY(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-down.mui-leave.mui-leave-active{transform:translateY(100%)}.slide-out-right.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateX(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-right.mui-leave.mui-leave-active{transform:translateX(100%)}.slide-out-up.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateY(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-up.mui-leave.mui-leave-active{transform:translateY(-100%)}.slide-out-left.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateX(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-left.mui-leave.mui-leave-active{transform:translateX(-100%)}.fade-in.mui-enter{transition-duration:.5s;transition-timing-function:linear;opacity:0;transition-property:opacity}.fade-in.mui-enter.mui-enter-active{opacity:1}.fade-out.mui-leave{transition-duration:.5s;transition-timing-function:linear;opacity:1;transition-property:opacity}.fade-out.mui-leave.mui-leave-active{opacity:0}.hinge-in-from-top.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:top;transition-property:transform,opacity;opacity:0}.hinge-in-from-top.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-right.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:right;transition-property:transform,opacity;opacity:0}.hinge-in-from-right.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-bottom.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(90deg);transform-origin:bottom;transition-property:transform,opacity;opacity:0}.hinge-in-from-bottom.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-left.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(90deg);transform-origin:left;transition-property:transform,opacity;opacity:0}.hinge-in-from-left.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-x.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:center;transition-property:transform,opacity;opacity:0}.hinge-in-from-middle-x.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-y.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:center;transition-property:transform,opacity;opacity:0}.hinge-in-from-middle-y.mui-enter.mui-enter-active,.hinge-out-from-top.mui-leave{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-out-from-top.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform-origin:top;transition-property:transform,opacity}.hinge-out-from-top.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-right.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:right;transition-property:transform,opacity;opacity:1}.hinge-out-from-right.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.hinge-out-from-bottom.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:bottom;transition-property:transform,opacity;opacity:1}.hinge-out-from-bottom.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(90deg);opacity:0}.hinge-out-from-left.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:left;transition-property:transform,opacity;opacity:1}.hinge-out-from-left.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(90deg);opacity:0}.hinge-out-from-middle-x.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform,opacity;opacity:1}.hinge-out-from-middle-x.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-middle-y.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform,opacity;opacity:1}.hinge-out-from-middle-y.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.scale-in-up.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:scale(.5);transition-property:transform,opacity;opacity:0}.scale-in-up.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-in-down.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:scale(1.5);transition-property:transform,opacity;opacity:0}.scale-in-down.mui-enter.mui-enter-active,.scale-out-up.mui-leave{transform:scale(1);opacity:1}.scale-out-up.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.scale-out-up.mui-leave.mui-leave-active{transform:scale(1.5);opacity:0}.scale-out-down.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:scale(1);transition-property:transform,opacity;opacity:1}.scale-out-down.mui-leave.mui-leave-active{transform:scale(.5);opacity:0}.spin-in.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:rotate(-270deg);transition-property:transform,opacity;opacity:0}.spin-in.mui-enter.mui-enter-active,.spin-out.mui-leave{transform:rotate(0);opacity:1}.spin-out.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-in-ccw.mui-enter,.spin-out.mui-leave.mui-leave-active{transform:rotate(270deg);opacity:0}.spin-in-ccw.mui-enter{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-in-ccw.mui-enter.mui-enter-active,.spin-out-ccw.mui-leave{transform:rotate(0);opacity:1}.spin-out-ccw.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-out-ccw.mui-leave.mui-leave-active{transform:rotate(-270deg);opacity:0}.slow{transition-duration:.75s!important}.fast{transition-duration:.25s!important}.linear{transition-timing-function:linear!important}.ease{transition-timing-function:ease!important}.ease-in{transition-timing-function:ease-in!important}.ease-out{transition-timing-function:ease-out!important}.ease-in-out{transition-timing-function:ease-in-out!important}.bounce-in{transition-timing-function:cubic-bezier(.485,.155,.24,1.245)!important}.bounce-out{transition-timing-function:cubic-bezier(.485,.155,.515,.845)!important}.bounce-in-out{transition-timing-function:cubic-bezier(.76,-.245,.24,1.245)!important}.short-delay{transition-delay:.3s!important}.long-delay{transition-delay:.7s!important}.shake{animation-name:a}@keyframes a{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%)}}.spin-ccw,.spin-cw{animation-name:b}@keyframes b{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.wiggle{animation-name:c}@keyframes c{40%,50%,60%{transform:rotate(7deg)}35%,45%,55%,65%{transform:rotate(-7deg)}0%,30%,70%,to{transform:rotate(0)}}.shake,.spin-ccw,.spin-cw,.wiggle{animation-duration:.5s}.infinite{animation-iteration-count:infinite}.slow{animation-duration:.75s!important}.fast{animation-duration:.25s!important}.linear{animation-timing-function:linear!important}.ease{animation-timing-function:ease!important}.ease-in{animation-timing-function:ease-in!important}.ease-out{animation-timing-function:ease-out!important}.ease-in-out{animation-timing-function:ease-in-out!important}.bounce-in{animation-timing-function:cubic-bezier(.485,.155,.24,1.245)!important}.bounce-out{animation-timing-function:cubic-bezier(.485,.155,.515,.845)!important}.bounce-in-out{animation-timing-function:cubic-bezier(.76,-.245,.24,1.245)!important}.short-delay{animation-delay:.3s!important}.long-delay{animation-delay:.7s!important} \ No newline at end of file From d619647810c2bf9176f9ae0f5242870d742c8529 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:58:42 -0700 Subject: [PATCH 41/50] update work testing logic --- app/models/work.rb | 25 +++++-------------------- config/routes.rb | 10 +++++++--- test/models/work_test.rb | 9 ++------- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/app/models/work.rb b/app/models/work.rb index 3ec1e22f3a..f95ea5cde6 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,27 +1,12 @@ class Work < ApplicationRecord - has_many :votes + has_many :votes, :dependent => :destroy validates :category, presence: true, inclusion: { in: %w(movie book album), message: "%{value} is not a valid category" }, allow_nil: false validates :title, presence: true - # returns the first work object with the most votes: class method - def self.spotlight - works = Work.all - max_vote = 0 - spotlight_work = nil - works.each do |work| - vote_count = work.votes.size - if vote_count > max_vote - max_vote = vote_count - spotlight_work = work - end - end - - if spotlight_work == nil - return Work.all.sample - else - return spotlight_work - end - end + # returns the first work object with the most votes: class method + def self.spotlight + return all.order(votes_count: :desc).first end +end diff --git a/config/routes.rb b/config/routes.rb index 063057b1b7..eeff3ae7f6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,14 +1,18 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - root 'homes#index' + root "homes#index" + get "/login", to: "sessions#login_form" + post "/login", to: "sessions#login" + delete "/logout", to: "sessions#logout" resources :works, except: [:index, :new] - resources :movies, except: [:destroy, :create, :show, :edit, :update] resources :albums, except: [:destroy, :create, :show, :edit, :update] resources :books, except: [:destroy, :create, :show, :edit, :update] resources :users, except: [:destroy, :edit, :update, :new] - resources :votes, except: [:new, :destroy, :edit, :update, :index] + post "/works/:work_id/listupvote", to:"votes#create_from_list", as: "list_vote" + + post "/works/:work_id/upvote", to:"votes#create", as: "vote" end diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 76f41152e7..3c46fe3d54 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -1,8 +1,6 @@ require "test_helper" describe Work do - let(:work) { Work.new } - describe "validations" do it "is invalid without a title" do work = works(:badlee) @@ -45,11 +43,8 @@ describe "Entity Relationship" do it "can access Vote objects" do - work = works(:lee) - user = User.create(name: "ken") - vote = Vote.create(user_id: user.id, work_id: work.id) - work.votes[0].class.must_equal Vote - work.votes.size.must_equal 1 + vote = votes(:one) + vote.work.must_equal works(:lee) end end From 36724e4f5251cd50f9238eb9e7f2909f53ec56dd Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 17:59:51 -0700 Subject: [PATCH 42/50] updated works controller --- app/controllers/works_controller.rb | 8 +- test/controllers/works_controller_test.rb | 272 +++++++++++----------- 2 files changed, 141 insertions(+), 139 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 98fadd904a..ca89c00bfa 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -16,6 +16,7 @@ def update user_name @work = Work.find_by_id(params[:id]) if @work.update(work_params) + flash[:success] = "Successfully updated #{@work.category} #{ @work.id }" if @work.category == "movie" redirect_to movies_path elsif @work.category == "book" @@ -24,15 +25,17 @@ def update redirect_to albums_path end else + flash.now[:failure] = "A problem occurred: Could not update #{ @work.category }" render "edit" end + end def create user_name @work = Work.create(work_params) if @work.id != nil - flash[:success] = "#{@work.category} added successfully" + flash[:success] = "#{ @work.category } added successfully" if @work.category == "movie" redirect_to movies_path elsif @work.category == "book" @@ -41,7 +44,7 @@ def create redirect_to albums_path end else - flash.now[:error] = "Error has occured" + flash.now[:failure] = "A problem occurred: Could not create #{ @work.category }" if @work.category == "movie" render "movies/new" elsif @work.category == "book" @@ -57,7 +60,6 @@ def destroy work = Work.find_by_id(params[:id]) category = work.category Work.destroy(params[:id]) - if category == "movie" redirect_to movies_path elsif category == "book" diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 75769e7721..6386244fb8 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -1,164 +1,164 @@ require "test_helper" describe WorksController do - describe "WorksControllerTest" do - it "should get show" do - get work_path(works(:lee).id) - must_respond_with :success - end - - it "should show a 404 when work is not found" do - get work_path(0) - must_respond_with :missing - end - - it "should get edit page" do - get edit_work_path(works(:lee).id) - must_respond_with :success - end - - it "should update a book" do - put work_path(works(:lee).id), params: {work: - { category: "book", - title: "Testing Update", - creator: "Lee", - publication_year: "4444", - description: "blah blah" - } - } - - work = Work.find_by_id(works(:lee).id) + it "should get show" do + get work_path(works(:lee).id) + must_respond_with :success + end - work.category.must_equal "book" - work.title.must_equal "Testing Update" - work.creator.must_equal "Lee" - work.publication_year.must_equal "4444" - work.description.must_equal "blah blah" + it "should show a 404 when work is not found" do + get work_path(0) + must_respond_with :missing + end - must_respond_with :redirect - must_redirect_to books_path - end + it "should get edit page for book" do + get edit_work_path(works(:lee).id) + must_respond_with :success + end - it "should update an album" do - put work_path(works(:dan).id), params: {work: - { category: "album", - title: "Testing Update", - creator: "Lee", - publication_year: "5555", - description: "blah blah" - } - } + it "should get edit page for album" do + get edit_work_path(works(:dan).id) + must_respond_with :success + end - work = Work.find_by_id(works(:dan).id) + it "should get edit page for movie" do + get edit_work_path(works(:mee).id) + must_respond_with :success + end - work.category.must_equal "album" - work.title.must_equal "Testing Update" - work.creator.must_equal "Lee" - work.publication_year.must_equal "5555" - work.description.must_equal "blah blah" + it "should update a book" do + put work_path(works(:lee).id), params: {work: + { category: "book", + title: "Testing Update", + creator: "Lee", + publication_year: "4444", + description: "blah blah" + } + } + work = Work.find_by_id(works(:lee).id) + work.category.must_equal "book" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "4444" + work.description.must_equal "blah blah" + + must_respond_with :redirect + must_redirect_to books_path + end - must_respond_with :redirect - must_redirect_to albums_path - end + it "should update an album" do + put work_path(works(:dan).id), params: {work: + { category: "album", + title: "Testing Update", + creator: "Lee", + publication_year: "5555", + description: "blah blah" + } + } + + work = Work.find_by_id(works(:dan).id) + work.category.must_equal "album" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "5555" + work.description.must_equal "blah blah" + must_respond_with :redirect + must_redirect_to albums_path + end - it "should update movie" do - put work_path(works(:mee).id), params: {work: - { category: "movie", - title: "Testing Update", - creator: "Lee", - publication_year: "6666", - description: "blah blah" - } + it "should update movie" do + put work_path(works(:mee).id), params: {work: + { category: "movie", + title: "Testing Update", + creator: "Lee", + publication_year: "6666", + description: "blah blah" } + } + work = Work.find_by_id(works(:mee).id) + work.category.must_equal "movie" + work.title.must_equal "Testing Update" + work.creator.must_equal "Lee" + work.publication_year.must_equal "6666" + work.description.must_equal "blah blah" + must_respond_with :redirect + must_redirect_to movies_path + end - work = Work.find_by_id(works(:mee).id) - work.category.must_equal "movie" - work.title.must_equal "Testing Update" - work.creator.must_equal "Lee" - work.publication_year.must_equal "6666" - work.description.must_equal "blah blah" + it "should create a book" do + post works_path, params: { work: + { category: "book", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" + } + } + must_respond_with :redirect + must_redirect_to books_path + end - must_respond_with :redirect - must_redirect_to movies_path - end + it "should create an album" do + post works_path, params: { work: + { category: "album", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" + } + } + must_respond_with :redirect + must_redirect_to albums_path + end + it "should create a movie" do + post works_path, params: { work: + { category: "movie", + title: "Testing", + creator: "someone", + publication_year: "4444", + description: "blah blah" + } + } + must_respond_with :redirect + must_redirect_to movies_path + end - it "should create a book" do + it "should affect the model when creating a work" do + proc { post works_path, params: { work: { category: "book", - title: "Testing", + title: "Testing book", creator: "someone", publication_year: "4444", description: "blah blah" } } + }.must_change 'Work.count', 1 + end - must_respond_with :redirect - must_redirect_to books_path - end + it "should affect the model when deleting a work " do + proc { + delete work_path(works(:lee).id) + }.must_change 'Work.count', -1 + end - it "should create an album" do - post works_path, params: { work: - { category: "album", - title: "Testing", - creator: "someone", - publication_year: "4444", - description: "blah blah" - } - } - must_respond_with :redirect - must_redirect_to albums_path - end + it "delete an album and redirects to album list" do + delete work_path(works(:dan).id) + must_respond_with :redirect + must_redirect_to albums_path + end - it "should create a movie" do - post works_path, params: { work: - { category: "movie", - title: "Testing", - creator: "someone", - publication_year: "4444", - description: "blah blah" - } - } - must_respond_with :redirect - must_redirect_to movies_path - end - - it "should affect the model when creating a work" do - proc { - post works_path, params: { work: - { category: "book", - title: "Testing book", - creator: "someone", - publication_year: "4444", - description: "blah blah" - } - } - }.must_change 'Work.count', 1 - end - - it "should affect the model when deleting a work " do - proc { - delete work_path(works(:lee).id) - }.must_change 'Work.count', -1 - end - - it "delete an album and redirects to album list" do - delete work_path(works(:dan).id) - must_respond_with :redirect - must_redirect_to albums_path - end - - it "delete a book and redirects to book list" do - delete work_path(works(:lee).id) - must_respond_with :redirect - must_redirect_to books_path - end - - it "delete an movie and redirects to movie list" do - delete work_path(works(:mee).id) - must_respond_with :redirect - must_redirect_to movies_path - end + it "delete a book and redirects to book list" do + delete work_path(works(:lee).id) + must_respond_with :redirect + must_redirect_to books_path + end + + it "delete an movie and redirects to movie list" do + delete work_path(works(:mee).id) + must_respond_with :redirect + must_redirect_to movies_path end end From 9f5dd7e8265a70df231a1faaf80d517f421cabc6 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 18:04:11 -0700 Subject: [PATCH 43/50] updated erd and schema that reflect additional migrations --- db/schema.rb | 8 +++++--- erd.pdf | Bin 29320 -> 29792 bytes 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 1092e8fa1b..51eb1aa4ac 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: 20170411043218) do +ActiveRecord::Schema.define(version: 20170415145143) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -27,6 +27,7 @@ t.integer "user_id" t.integer "work_id" t.index ["user_id"], name: "index_votes_on_user_id", using: :btree + t.index ["work_id", "user_id"], name: "index_votes_on_work_id_and_user_id", unique: true, using: :btree t.index ["work_id"], name: "index_votes_on_work_id", using: :btree end @@ -35,9 +36,10 @@ t.string "title" t.string "creator" t.text "description" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "publication_year" + t.integer "votes_count", default: 0 end add_foreign_key "votes", "users" diff --git a/erd.pdf b/erd.pdf index d49fb920209eaebf31f651eba284ed8899d2e20f..887cbf0543a47a405109356ce349fce2c4165393 100644 GIT binary patch delta 23315 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 z�Rj@P927=;%q6Q2zY6~!O(;I-*`|XIK>XfYP=J{I1sy$<76cBMCj<(Z z3b^|PokrMah+?c9zY)C21*shNlNZzZwVcBRTm$8WTv7gKX?aceuY57HFnTIHd2&Yp zf=fsA+iJdFFELD1bnrrA1#XEwM;?~qnsAc(Uy-o|%{iP4bJ9!rq2R76nI|#Tx+;i>nPE zCdYy6uN0R#%7Ub&xwS3#R_mZBPo3H6Y8&fVPnciUG?!X7$B6Doa&z)a+ltZusvtOn;0H=Tm6AUmj#_U6RgY^ z^ngZ2uD~D=)&$J$$rPH|1{wo0nG*1Rwp7_7_(AjbLhy7;#DiO~onS}KG2$I!BUwx8 z!~Xy~fz5%S0@Ht(9u{beSqyJMQ~M9>fObYGz+T`Ft7L0JpwHiTWN(xxNe#m99yI!! z8pjx8S&6S87DcaFatUrbQNqcAnOPItVZb(t(zU%U%k0pw=yp*co_>r3GPoA{VB4$R!hQ07y z@NS^(Kd(#VKtewB58Z+UaAACJ@|P90d?ml&>!PEzp1)oYUQj!97YoHlL%&F++eE24 zuMlJ5zs{8BJTM7J&fo#tlg&MUvmt;X6OcuP+-uGrunJYoe1Za^e9#BlusASFD6t^k zANU;tKawuA$FJ82iK6HSlYfcO2r`k85KLo1E~h@umD>Kk5;5#?40mj)lhZAjn1}Yj z7wDU=^g6-r(RNxUeDv+nVLi{xJIM`*IFE@s`M|Pqy~FWH z`*AB}dn;(2Z)06{Z1YVdYgaq_(`97vEg)3m{iy3hXlBD-R}%8JV_Daif%xF^AF%3M zah{1GyV_jzLr4@*!2Vx`3^cyXd3)i+N4}+qr{W;6JrK>rw5{2Z?JFs_t9qXM-qVx( z6tNNdY_j61PaoFhQpZgXUl|$lqSTHv~`jnH)&%Ah6YchsJ){(Zq4Pop%u~EuZDNoONV5D|!s%jd3cDv-m6%-@e9xWsWq;3+9{W8Yjd>o#vxs{yh zt49#`h|~Xp*7``d$2AAB>>{%VF!yo5($Dv_0Rz?EnC{WMdg=~}+&+#Z>Hl_A^A))1 zE7~Gx6Ia(gh|eR-%W4H)SALULE!Q2?$d$1hJsSf~G%$64R)L%h31{*(3F~vX`+9$t zOFFoDK%Ncf)pKUrzF~ZhjiXl(O$aK?hsAf-1+U;ERmOk+#2L&{Lq59*DZcF|sj`}H z1(XzvM_VsXTe3mB9fu&r-Jd@Xr0-`-$wK0+ikr6_eEjk!hM*lI2)6XfiD*67_z{g` zrwKY)N2hFzzo+6CHHgJjqzcxtGiP(i`W!^OvB{${;#WZXrV@e9Ieb<7xliSE%>RxQ zUdIX@DkL2!y)jxp3Vz2S9M|Ou3@Ax=2H;j?eZ<;RiBkV;sGX9XBDUaRK|TX0^h6m+ z(Il7*_=gfn?J$l_S%|u*tL_^g;xy^KAzrO3F;Qh}C1qM*gJM*aYbfImGyECpDK*Dh zEx0e07HO|kHi6zbAITTMuS7g5ntjR`XJRG)!q=bsq!xTv9qB@H@pFDiGnm+_fK#cN zd?5EBd8K?=6m^tahByug#Vv7+%Qf+-8BfNEI$r~Ii%xlvE`fSKN_UP?ENfKb4sA_U z@zf%%)J923k%)>#$Q)88An_rwr{ir@@eq#NPKB04HHXGXLyTp_*LRH6rjLuO!=?hm zeIZC;K#pHuCut{n2ROi`1Q^i)*i2?o#8rXFZ&6&5)k{#C12DV-CHky*4?3lN4f9em z#A*sA68Kxk><%T*io@Jta!0}&wJ-jw%NC7b%I@hat&3g5vc18g757X|qR1zV&5ZBZ zaE8az*6hlq2q^`s1j;i1u!;1XC7pXdk+rAz`G>^nJ0*}ol=)k4C0N@SpsbVJHQIb= zcUEA2!sLr>sK7hV{4nw$?wd$bMyrRNJ(1R|Ij>P^=qsNWWEa0lzEcGCo%Mt|KaFY{?&$fU@o4^dzAXW_la0tSK`UcxyWM-s zH)Oq4w_}-OTAh45z_4BSIldQv{uRL|?*j(Idrvk&F}sA|)W?;VF|7yA^b5|%NDN1D z0gozGSh~F_`xooPoc(OP`N4_1tA2d&a(#2|1rs5ya&fCWir%mcHSD6mKkFdv(fUO2 zSLvF|1U#RRWhE!8@)oOkNYY9ok$Jm$IewZR>3F%33YEZ6z=t7^1~0LRssblDH0#&_ z_al|!8~$tSqKXs6Of!K*?9OSsczpSSwF&OgJjGjFN)VwCv4$2+fRrQk#M;g%*n>AC zD4!)QJ+VukeM?S+T2+iO+@@~n$Zp}3utxdH%%&xs?bW8HF6T&1{(!1|j^>p7lKx3V zPZniN=I-|cfXE6E`Kg~plfOJ!rdSBho3tVCXNCzf(q#S4WFg1Mm8H0I`OzMyk(3km zf%79(X0@ef_Uf|%QhT0j(VL84lN{Hh0S$G}7tB*49I91(q&^h;o$_>P+A_c*YFNS4 z!&&2gdDfmo^cKp8tufRfyCVWALU=WKH4;6af)scOIHd3NIgx21C_H?hy{ycVzeu#w zFylKnyKd&c=v910w3V%h@DD#<*`4&BLM&1IV$76ez}&#Nmgu}UF(su!+-u1D!_fB! zvrO)@#QT@Pxr$PXw4unii|tCGz!}S#wY1Rqnw<%6VIEd95C$bL{)3=X;!-^ zum~dnu!qIgQnMqzm?1tJ>;!4s{(G5V7>;8m)zs0~FyOMa*o)kQZu~Iy0nN#&@ChsR^wUr5EqfYlh#uc0gk@<7#t_ zNLFOI+vIyk?yLltDf(8O_)GyFw1C1(h{BZsj4Cqh0YnMzJ+%)L557g&5vX#QsNnp$;~dB9;}ze3bq8SF9Lj5aNiQ=Zs=nbdpaUizx33EzWu5pYol zc$?-ptJ2eSCPwYEyIc--s0h(4!jRIcTp@YjK6p8tYmW9GW%#&wyC|9m7});B<97Kk zao5IoIq~hi7DoQv13G{@mRLQOyw@eV-E>#d)cjX!-eRsEt#8o@2-sk*ER*D?41qT% z4!c^+&qD|HZju2xj>D9DKV$~0lFtoXqY4XVuky!4yJ^6FI`PN@ZctOUHLx#6QyK+A_*&0CrMf{2L zMk#_7sTAjmb4CbwI8^^Y8)d~R8AA15iteO|F=+Leg|vHbA)J`wV>k3UWhhnlk=r5z zfo_ukQp5;d#>jl1Suv~NHfCgVMDed0rs-Y5cdaJ0Fz@4bs_;mvhJoL44NC4)RroSjpT(B$^{dzyJ)O$7VTj^{J`|KPvaBi9ai|32qMN z`MXUp?5%WHN}PXb=(_1D8W*{l@|A>kJvFAUO&C_&nOr6ZFQl&m%0)$NenQf6|X}-=71X_aZ4b(Elfh0ph-tv}{r&l3nh=_65Q2XibiYCe!%j?DgvLpM%cub0=>{}n!pdVZt0a|~ zuly&$HZW_%2&o(_2()at%LKHEo4*Xcz-rb~|2l2+TyJA!-KB!({pGwT?=6!iJV7EJ ztVw$pAb0j{w3K))CwB!KfI*7#w;lhD*Y{0}vzBVITpWwHaU3(dE=Ns-JZu3*CN4#x zc|PQBLDE6=4Sf?p>MFfoLXrpN{P%0O>9^Qlij6tIT|*v5hzdG>D=bKCmv$=7()Z^@7DdgfI2{$YtF zYb~9xczw#sA$Q=fW?W`@=?7hHyt%m7EGFY9D}DL|B1<};9BXoccd%}*eP}tmJ!6Lr zVE4*n#md;Ip+`SS?}BT|FN_#oOE4S`jZmAqe7T&v9ID;C(7E9|&Y(BNLs;GXL@jcz zjrBW6eF0ngr#1IaCb?D~LJd1H*XKs-C*La%7zlxW>*IraGH%dtQIG|}a#0If?NI-j z92H|Z>n#X?7fV?cwQ@9S#W~+Q2+w3hW(|d{c8|I=NSaPb5_PWpS>0k?$~&%E7k{~QApEK6Y#Z3@L% zvF`!=dyDNjULWwX53njTbGGiob7uAT&^DhNZ!1lZ;dHFcez-U~%`OwH#W7YH^uD~A zAXpc^^jfZB){R|te(Rb_k1LeDhfvsV>8GF4o$9y{kbAgHJRzH=$4dU~1&yj1x0Y5+ z|6e~6SL$EyMCg#U-}`?;|D5f{7kJw1hgJ6jc>k-du9P@6EpB8P=)R|&>i$Suuk$cG zKS%9#64@8o|Fm8|zMAPFwIo8N3EoaDo7FiXs;q3O%&Kh5%(CN><>*bGp|_&mVz9%% zg>4bARYLutoR>2|Q0kRZmemV}?&{7+`Ivr@^V#)A2AQ5D)#hLt=3MPa$U= z6xH|te+fb9Q0b7AW|vK3L6ML~K|s1gnnhAqN=ibOTuMT^R=TB2Ktd^LSVBV51q8l) z-krjZ>zwnvo&Df0-6u99odTNMhjYR~NANLkE- zj9AGN?gFTXJ5wz?gVpuGv6egw3@{8s-@o8P8(82<(4Lt-K%R6fB05(_$Wg2&MpU%l zYJ==1%63gf1IiFQN+&9a#G{*^H!$ot>xH)XZ*;Ae1U>%;f=MBc^!Y*jo!mry7p!(_coB^I+2A&o+icW_ z5I96P>gn6!o37tX^@g;rU9X&;?$yuqiIWmiRJ>kl1ne#Ih8{o5XAom@GGs)C-zmBg zUOIIy?x*kDyI;3oH(XNd9W|hzTBTMw)HFS6@6-Of$-I2er*g`=W%f5Mx@3ynvDmS8 zl7}TET)Uj(5k40KC}p!^fNN-2`c+J+O)?J;16~)d=^v#{esh%lmSh=mU7$u%MYn7K zrE~jx3YYg1y>z{FY=(!jQc!~m+n9k5fBHMG(VGWFEURKZU+L*psLOZ~TJ6;xa=KNC zcC;x<;Pfo|+~26IYm*oR)%kz+Onswj0c$}goGirLUVDnxiuTth=$IE~OD&I=$56a% z#+iEk-sEVToioI_yu|IzB+jZs8&Mu%C>yP1k9eo)^Dxv&gx;>3zB%+n4oTaWj$_-Nd0RnA<@7~(~S`{m3T z_KUQhIOBnvXX%mK?AItWcp_~Xwq*SAfP*kPEs3-YG*l^!^)ERe_l(ZK3WAKeKVojN zfJSpG=?ikL_HR9*!_II;xKC=_Zgg;|@tV%U81coS1@(AP^f0fj=WK9NWGJ!+c{Ba9 z0Z5*I0~peKQ>t`e1yfGn-_u3sNZ%MUlxhGx;8K6?kO^_U-&i-QdylB!tn21bB^j0M zx`7}4c*(8b5$%lpOeEqiqAmxOi_-{!@+o)CX~ecjp8-sOYUw*&E?9E`z68l7Xm4zuUpL)4oA@HI`MakPMtgpd zi?uz-b_!CO6h27y@pAOX40*_YQwo#~ktmE|Z z_x9fz|IT*3kqntrsYqQcoNR@O*OhQ|{`TG6sX@UY@(q{)d55)6Cgn&0uTwU=J(~9m zyEE4$htbfN;eDt`mOAn1w9gz?`f`h}TABXF*((m=E zT-9NDA-wXo87NtLGI-^o_4PGpDT;y_O4Pg(OsZZ>C2{cJyekHM8Yd)2rFLgT53se>5}9?!S~5rFp*jhEntEnTmt^|-?A)w6<&d{Hcj=Cbj*0;q=pjoq6H0>x z*+~N`fgqV*SW}b3Gh0f0G){BX~iWfRlefANMoe**><#k?%7QLvn?tSFB6%9VnRM05m zz82aLk|k(l41-Tp^^B@Sj`2=bqDq^aoA+C(*-k}`qhEOiD+SeZ3D7^kuq#&-*6;9a za#RcNRaHTs^lJA>OL4h_<90-`_JJ_GY~DLtPI&3NK+IQ+hWdk`UDmL7k7y$*8toXCeCtH~APx>%Q)xW*71HY@XphKhav>#5d!x>2SaQM+{_D6Kr9-(fG5%VaJ z1C3ka@1!we^+PyAWADY|%Nap+)q0he-+5Y&MZ!MjeAyL0KSx*ujP+hO9d1^NW;~@s zJ;_fI=A}Ie_HX~0b+#OfGaj6x@%SNc9@N7DRDKMTc(1;;RGu?kF>e&?R}-UC z$^WrK^V|Y<8M64>0v6w@we1gU{TzBg9!gRzFO7S^WFqlcOPykCZF%vmZpk&6oiG0E zsj#x3o2ZD}v;4X&S4#f&RbDPhE>Q#|zd2To(^iL{Bl!lFhs%*`E)Av3F`llCXtNXnU3SQ+zDRsI@4+7S)x)zhJMY(#loP=#ZrpQV)tG# zYTB^XdovH~emJ*5eh2k!cfQ$6Jn7uOD-in&f$*07F;!uXlb2=pm*o{3<&R}xXnv$V zraTQgjvvkU=Xr^F@k}x`FT^?HsSv05gwP?uYQh=}}c0dLGQAAb^Aus~+<3k_Ga`1L%;k)S8~c-1RPjXFGq^l701w^!42Lna&^ zM=B-psNF*4ZLpUiTjEA|-G=R{4Y#LO!~ITWJ}OysZHQ*2+WKuD=i<)a2e#7~X9qrr z|Fr7y9Zi(P1Vt21hRe1G*k-%|8f$HAIIjw4FO$pKEvAssikTWk;sVI76za_rLz^b8k~1-y2=^8(Ty>{20XxP$)SX@k+sP zw<)R8N1kVtq-SU5JADxwso6NZk zX=D{cp;dMW5gb3w5NW^-RD{G`5&p-($4cQEBOwcdF_I)KZ9l};M44TmQvnPYL+L}c zY-u}aQEG(XcCe~_X@zVjFRa8u*_n!wX?3}bIoUVh1Ci@EW(abwMN1zbG}Pr3yIl$ept3|@Sp$TmY&>XDon44fN5Vk-GlepW zE_q=_W*aKoTOSy#)q3^WrfElGJY$Yb7hBrr-?#REUw1wf8xw=p3JA>(oS$d4!eV@* zPcPzp+I_eVyzkMvhpZ;ksfs1^2%=Yn;!pZ}@=&%E0(_0PHNdiQUm9F_?w8D^bto1w zqI4}Qv19i_iOJ;y)4N+b`HR90{c_BB`oBl#^u82!mJHyD;eVZ`(~&mWT@5NtzAeQS z{QDO=?0}S}ojIS1^WlwGi`SM)D!LiiV~%b=PZXR$16E*$14i}N?OnMN}sGUItZh0nj0 zIE9n4vz+b>6x}Zky#2|e>UkVG<4i8#9rr}y}sx>{-vPM=PT78 zznM+29FnMFX3g%#WnhT+!bf6jcft{d1=4?bTC2rC0OZ zs>h;kM)Fk;a9uYEQ+AU55yuR4)RnpcBE=h@nTewVC0Ad#CF_}J#6xTJU3?Qle?PYy zJDDZTLddpvm{gvO>^UXq8OywC4|da&l2~2m-hR@JNRg`l=rgz=l}45jw$XS$dBIRh(k!NV#I<&@CJn_unjzwC@R9L5BF4|ksm;$hD)TEK@0NB>zV^JG z9SDM99*jz~KDB;h-EEy`jk8XivvVmEfnw095{}3rf6E|yH>BI#^v~(Ep|ng!luZl& z?nR)V62jSk`nUehGF~ibB3qR80sqU4tpjDebesn}?Mqm~LyqV$1nX4^6*rQEzgpar zI6SeY_*rp^AtG-ekCqAX>MeR(WTBJVSEyN{iM*+?Ikf3nDsSMTC8g zBwA-T)<8JFL}Fhu?V_I?jB^sRmgsj@l{&ZQasal??$r&P@`4LW=X%PY_!peQpyuk7;OJXr$ zn@=weapahi43lU2D!SQ8Eb`W)1|@M=-a z^L5nAXM=1ROo}kpY9T6K^>-j$QBsmbi zvqxHe3sSynZ5NqpsD-vJixaGRD&#{;pZvSbtWtXy6(Rb&GO~AuyCx94uyb75EOn2) zv<7n748+9n^muZo&TaY4Xs@OT%2n}e@^6me`i&1K$945NPRqcg;xDL~fU~vg=2v4` zzc#D`R*gHg(MdY;^ef+%&|X8Rl1VJHYtRN$-X-cwNw-pb>L-k!a6aQ)|n)1 zdcfIIb~b~s2&Qni8|unTz4Y_D5Emh?t*?JN5rp!>IOxm4ul7s`O28+)@d9r7<5BW(u6Uz8KGtpn#>H zdhC%xj#F+I)!gaW7`z+{k;TJ1Djo@P&oqm>sB9mhgrjilV@5U@9MC>|gbMi1La%cf z7hSCB-Q~PU-N^RcZW+XN)X*#P+dTeBM#W5@C-JIFTt2u>N-|-R3l!5Kh+Hw2KB; z(~Tsk#p^7LdL|vnUEVhSn#h35?Hvo!MPzx2@(yeJ)KOo=SBpyVQYwy~=ZCI7)|Hw1 zhc9FowXZyo_?oW07R(*u^~m{f!_@7Ny6i3cpj)B)a-*IsL>_R2*_s%_c>b!J%RJIB zfag>N%}Ug*m1(1G2d7#R61czQ6AQ;_1WGBQP7O9Y=SxTEb4*mL6|({B;COrYI=nrZ zr4qHE67>TR-noa3;L=3}9B(x<5cR#qaBG!>7{u$FA+Fyb(`z295Y3KyLYZQ~%R_xr zgVaZ>EDc?%4`ZLi!>HBVaaf2NWT+!QiSpF91ANH*Ezd>5k#hny z@?-Mol=97ww}$I?UNj;@or_xretPV`UhL^!>&@v->UBZRc0+rgcXO{8FR!g|FMF-L z#as5DeBIfWAZSXAXt9%K62J!QwUbS-i$aN=f9 z_!EV3U{tqbAc3$nGm+CZQcF_H+=`EMD9_(7l~T0xCzL1@^V`fidyo{-;q<#4AVqGY zJIxt@qOVMpbXk}O5@6dOy1HFVbP|W!mj{AW>d7R@4mSV^HmQg+iHTW)Os@+2ioP`_ z*hp}`oWTICuv=4nIv>z$!!JWK3JbPf*VPEjQSDu;zT}grlg2ss=5vxY z%8gVJ<7202Cwng#hd9F8SKFtpW&R{(@5!28;{8=aTdvp*<-M;7He`5f!|H7atB$Xj zn(Rgmyg#+Go^jH;GUaw-2Z4!Cy1hMZ=ty|rpkrk!Hy<}EwIwrZ(0O$K2!(!4XBHAb zMDXUawa|Z#XIXs?oXjNStT}so=Eq<{uCCP>M-Onf-(sC`kL2~yB@EUU|crzD+dO%|dtILrl zBGbfqSVL?LIQogmJ@D6;8zZCc^}4jX?@=_&_=?F}&Ti2{1<6Y_O5nV#1Tl^%Yf?*& zBdXGZex`ailfEx;`3X&|m+ppd(xCW-26dK+%GLRE^IySl;J@i9ul|2~rd$m3Cl|FG zO)_Z^^-o?~U@N*5wY-HNeTA-OHcRA-Q}~*XRF`gkyoLOfc)GY<0M)fi`xEHh%A&F~ zFjn$ubzZ4;S5^Hb>D+~P_kXs1{oB6~2>E{ohT?G0KMscfbu;{jqHV-!{@EL*t*N5% z_+e$Y-88}V{}w+u&=H^#9vf?pncYIT^h`&oGnQ@FlzDQ5Xj={FOHJF!b?USyF&ZaQ z(C5&Tj%^8jle}yJ$Bm6r-+F70eH!h_!fh#p&viNJuUAO~>~@DhwuwR;jwc3Y zQd;|q)#Sn9IL2`8g227OWX|KX1G=)OSZ{*;QK%WFQd~dt0?*RPBy|~sHWOLBpvp8S zw5yopH0l-UqFnIvBcxVbdqtO-zssTKFI^Q^UhXyL#WJgm4?B51P9FckV!>m_f_eew zKkamw5gK!`5%mOB=w(JV7`ynYT4pL{cR?w`mCrC;|C73fDSeES7i}vc(fcUgZoWN8 zVeXXt(F7KLxLW(h13OPXk*6By$ZUhI6e+a#04;KE5QeqK z10Q<3i|Xq0f>#Fw8{ON4ym2n0=3?-^Ih7|?g4rGyX`5`}J;c@_XbG{g2&9uFUlh6G z{pMF-pO=@TlC0sVs_dq(%GY8JPCZ3(1Z>Lp6vIK0_~WY*LH+a6jI zGNjLr(GUyNdH8uQm%*DS9li>NoS){{I86w$_@7(@?tQ*FaGHv?>Rm!z0Rf^NTzF9u5`SF- zfWTKSoBzHCNa8=A^&bobzw+w*7XyI7An`vL01o}DPye*KI-#jtDbR{;^eAxv82)EV zagc=gpHC16fk1yV80;?008)3$^bwR1i&ed`nL=q03`9J3?K+}Rq>B{P{5y^ zz6t^0Pq|mxfPXOv0QUbG>c8&_2n7QFj6DzvmH3;10Dm*+|H9yZMHL8xNc`Dppd1VW z{tLn&u)i5p;?KwcVNeJZz3GN9gIbAO*}%=MpDFFgO52#>=aqsYv!eTjHE< delta 22806 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

%8eUWK7=KYCBjM=Tp{uW%0=H=! zDZPRI^>Avq66Bow7+%Ka5uuZD72?a34_4gENA_S!i=lXi;KHpFObI5L%AL)w*RKsY zv7J?o?U>*7mNv)k&+b0IS{x0@dBxfsb*d%gPVhy_{^( z6I}C;NrjPUCyFkO84| z&4h40qAT;yb-FdrCuD$;b&)&s zwQJ7&hvb^!Q(p66pNDv#xWm^c#xjnln{>2AG^7JF4O>Rjr$*%m&qYao6%5#NnGP&7H5b;<^%V5tYX*>WX1U#2D0 zp+-HwLH%w&r zxJu0iqs~I)lpWu_)?he)xww;bHUOsK2|RoKDTCN{>l>DkA4%4>@ZQ)_P(xwJ3e!gP zj5&i+t51-RMU);^^7hJ?aD%U>Z#%DWyfp`7mz-V&#k;g*bunyR6kOv3jHJ@o<|-|F z2aY@h_h417FVzXRXovRAciDZ`b%MUx|C~H`Na8~GlLfamQaeePi{C3{vo6cVUKod!hS9=ap4sQED~48T^?ve# zGKZZxv*;*i6`od?JV;|X;N-j%Fr&YCNK2rLGp#i03p}p;X-^tT3uO*t;FkH!LiUFG zcBU+@<01c|-VMiO+T0uwo7?GS`Pu`rbzV?|D^ah-91G~nK0(@iath3x&SZceeJ#*xtd@5&&6!(aNx;F zrmko0OwB*OSG%+nN%np<2gx@lc*?WFXLs} zKj0p@wDPVF*J~^GkJ8GOf)Ik~IwD55V>u_+GSXQ52wCu-*UtKnC!Snz0&VFBy?)M* z9W-s(LuaVW@Y;Ctz{sA*sGhgOon|*-Y&WCBLw8c{{Gtrp0RpHZh0Dx>w`1q&rW7tN z+}tYy9UAoG^W3NxwoWZOuoam1dLcAR;$C%4mFRnSy}V!T3>{WJBc2|NRN ze00_r(^ryy!0F*Y7|<|ii6?cspWc@tZj)L_43aEF+tM)(uJ*>9%^i8u@aC_47(Z^G zD*7zL_6HWgb~@5JL|b}N(|qaCmXENajA7Qv-jTOPpr#qic)Q}w2^EpB7#zLf?W$x& zlp-pxfsLJt5L~qqy+T;A8GC_zQd&DV-@yH{DCZl{g0H}PhHMfo>EtrSul*o3PG^&K z_O)cuYH{TcWQi6n@z7jwO9~*G(6el$Qqpdr?A3hvHF`+EagSC@)fRz!=8lS#->Xj{ z(P2y!eq}>q;Kh}mZjl8<-}kyd0xJy5vvmw){;e}sx;?#zWy1o+$Kc6` zGTAhcmCplPm9)&IE+qV(bBF#w=`!h=s!9}q;m`4~_ui~B2zEfG=^|s8dg^b_5Qkgq7bN> zuBT{0sy8{bLQ70zH(u$IpYye+)k8}cmcOg_hTOf z3zCX$_^!`6nslyjWZ{!g8Q%Z6gx@uzc9-777<|lNZtOH+08U}p+>DYk0w^kG0R0c zhLjmwL;T_;)z_2s2D7>Oo<5@&7Gae^i13vZDAPqHp7Kf=n*S#1#4%}_s5g0R%tSD5 zG;KZ0!gF&$E`f0&p^F;(pCjWEue6Wm zk8uKQjwrcdRzcNygP;sYuy^WU}TWiY@g6Kc8Gg6IEHd)T(PM+5eEQnv# z70z(dGI+92!5?OapWZ&vVLsP?+zgJS(+}RPP8U=WK*p0BA>8`|NT1>wFoKM$dalhF zF^a77B|^Zf6zHW=i8$J)dZ$hbxOH>40S9F7o& z#(6rV3BzDWF7Q8#%Z`iUKL8AYA}{?L|C@tDQQ)`-j{Me8@xR_dU`WK@@o@NG92^4s z7Y7lCBmUwbXfPy>;K&Cckchv<#KD(SdjC!i`tMD^aM)iPgW)LfU;BxJ|0)OqL7^_4 zD#5^|%Kz&M1PVj_TLc0HBQ8xa|0|ixxW9xUPz3DX!k3l9|K?EQ{|H~Me{?zigCGdV zKfam&m;4WaB9QR71xLPXPy`xw3FrXWUm-~Gzlw#TAmaaS-X(|pn}hz Date: Sat, 15 Apr 2017 18:04:45 -0700 Subject: [PATCH 44/50] update main page view --- app/views/homes/index.html.erb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/homes/index.html.erb b/app/views/homes/index.html.erb index d8891a42eb..5804a83681 100644 --- a/app/views/homes/index.html.erb +++ b/app/views/homes/index.html.erb @@ -1,14 +1,14 @@ -

+

Media Spotlight: <%= link_to @spotlight_work.title, work_path(@spotlight_work.id) %> by <%= @spotlight_work.creator %>

- <%= @spotlight_work.votes.size %> votes + <%= pluralize(@spotlight_work.votes.count, "vote") %> <% if @spotlight_work.description != nil %> <%= "- #{@spotlight_work.description}" %> <% end %>

-

+ -
+

Top Movies

    <% @movies[0..9].each do |movie| %> @@ -18,10 +18,10 @@ <% end %>
- <%= link_to "See More Movies", movies_path %> + <%= link_to "View More Movies", movies_path %>
-
+

Top Books

    <% @books[0..9].each do |book| %> @@ -31,10 +31,10 @@ <% end %>
- <%= link_to "See More Books", books_path %> + <%= link_to "View More Books", books_path %>
-
+

Top Albums

    <% @albums[0..9].each do |album| %> @@ -44,5 +44,5 @@ <% end %>
- <%= link_to "See More Albums", albums_path %> + <%= link_to "View More Albums", albums_path %>
From 8495650d6c77b9bbdc6bf54744c3de988e8b4b4d Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 18:31:56 -0700 Subject: [PATCH 45/50] fix owl background image --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 69d0634002..a4f6bb64e4 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -37,7 +37,7 @@ div p { margin-bottom: 5px; } .page-header { - background-image: url("owl.jpg"); + background-image: image_url("owl.jpg"); background-repeat: no-repeat; border-bottom: solid 1px darkgrey; max-width: 100%; From 7123232df1f5c449b748489b73d21ecc4b00b0d4 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 18:52:47 -0700 Subject: [PATCH 46/50] try fixing missing owl image on heroku --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a4f6bb64e4..69d0634002 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -37,7 +37,7 @@ div p { margin-bottom: 5px; } .page-header { - background-image: image_url("owl.jpg"); + background-image: url("owl.jpg"); background-repeat: no-repeat; border-bottom: solid 1px darkgrey; max-width: 100%; From 0868073abe7de1c3fa579d86d8e91abfab7a6d56 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 18:59:17 -0700 Subject: [PATCH 47/50] try again to fix missing owl img --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 69d0634002..7cde52244d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -37,7 +37,7 @@ div p { margin-bottom: 5px; } .page-header { - background-image: url("owl.jpg"); + background-image: url(owl.jpg); background-repeat: no-repeat; border-bottom: solid 1px darkgrey; max-width: 100%; From 801dedca136a7969b66863f0ba8bf4de62c4f65e Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 19:01:29 -0700 Subject: [PATCH 48/50] update some css style --- app/assets/stylesheets/application.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7cde52244d..96759d8a58 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -27,13 +27,8 @@ color: green; } -p{ - margin-bottom: qrem; -} - div p { text-align: right; - font-size: .5em; margin-bottom: 5px; } .page-header { From 5a2377cc4352d56c82434c4efc2e46007da0598f Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 19:05:22 -0700 Subject: [PATCH 49/50] update some css style --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 96759d8a58..8314f13155 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -20,7 +20,7 @@ } .error { - font-size: 0.5em; + font-size: .7em; } .success { From aa174be8b10b962891aa1570e00b51efbc6016f5 Mon Sep 17 00:00:00 2001 From: Bo Trethewey Date: Sat, 15 Apr 2017 19:09:58 -0700 Subject: [PATCH 50/50] trying to resolve heroku style issue --- config/environments/production.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/environments/production.rb b/config/environments/production.rb index 53c750f891..2d39aedc0e 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -23,7 +23,7 @@ # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false + config.assets.compile = true # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb