diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..b9e6d5c Binary files /dev/null and b/.DS_Store differ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6e907a2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +### v0.1.0 +* Integrate rspec +* Add rake db:reset task +* Upgrade rake to 10.1.0 +* Upgrade sinatra to 1.4.3 +* Upgrade sinatra-contrib to 1.4.1 + +### v.0.1.1 +* Implement a basic class and spec to exercise it +* Relocate misplaced comma set +* Convert models/README to Markdown +* Correct misusue of e.g. +* Convert helpers/README to Markdown +* Implement a "em" helper for reference; improve README diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..2eb5c09 --- /dev/null +++ b/Gemfile @@ -0,0 +1,35 @@ +source 'https://rubygems.org' +ruby '2.0.0' + +# PostgreSQL driver +gem 'pg' + +# Sinatra driver +gem 'sinatra' +gem 'sinatra-contrib' + +gem 'activesupport', '~>4.1' +gem 'activerecord', '~>4.1' + +gem 'rake' + +gem 'thin' + +gem 'bcrypt' + +gem 'gravatarify', '~> 3.0.0' + +group :test do + gem 'shoulda-matchers' + gem 'rack-test' + gem 'rspec' + gem 'capybara' + gem 'faker' +end + +group :test, :development do + gem 'rerun' + gem 'shotgun' + gem 'factory_girl' + gem 'sinatra-partial' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..18cc390 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,127 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (4.2.0) + activesupport (= 4.2.0) + builder (~> 3.1) + activerecord (4.2.0) + activemodel (= 4.2.0) + activesupport (= 4.2.0) + arel (~> 6.0) + activesupport (4.2.0) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + arel (6.0.0) + backports (3.6.4) + bcrypt (3.1.10) + builder (3.2.2) + capybara (2.4.4) + mime-types (>= 1.16) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (~> 2.0) + celluloid (0.16.0) + timers (~> 4.0.0) + daemons (1.1.9) + diff-lcs (1.2.5) + eventmachine (1.0.6) + factory_girl (4.5.0) + activesupport (>= 3.0.0) + faker (1.4.3) + i18n (~> 0.5) + ffi (1.9.6) + gravatarify (3.0.0) + hitimes (1.2.2) + i18n (0.7.0) + json (1.8.2) + listen (2.8.5) + celluloid (>= 0.15.2) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + mime-types (2.4.3) + mini_portile (0.6.2) + minitest (5.5.1) + multi_json (1.10.1) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) + pg (0.18.1) + rack (1.6.0) + rack-protection (1.5.3) + rack + rack-test (0.6.3) + rack (>= 1.0) + rake (10.4.2) + rb-fsevent (0.9.4) + rb-inotify (0.9.5) + ffi (>= 0.5.0) + rerun (0.10.0) + listen (~> 2.7, >= 2.7.3) + rspec (3.2.0) + rspec-core (~> 3.2.0) + rspec-expectations (~> 3.2.0) + rspec-mocks (~> 3.2.0) + rspec-core (3.2.0) + rspec-support (~> 3.2.0) + rspec-expectations (3.2.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-mocks (3.2.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-support (3.2.1) + shotgun (0.9) + rack (>= 1.0) + shoulda-matchers (2.8.0) + activesupport (>= 3.0.0) + sinatra (1.4.5) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (~> 1.3, >= 1.3.4) + sinatra-contrib (1.4.2) + backports (>= 2.0) + multi_json + rack-protection + rack-test + sinatra (~> 1.4.0) + tilt (~> 1.3) + sinatra-partial (0.4.0) + sinatra + thin (1.6.3) + daemons (~> 1.0, >= 1.0.9) + eventmachine (~> 1.0) + rack (~> 1.0) + thread_safe (0.3.4) + tilt (1.4.1) + timers (4.0.1) + hitimes + tzinfo (1.2.2) + thread_safe (~> 0.1) + xpath (2.0.0) + nokogiri (~> 1.3) + +PLATFORMS + ruby + +DEPENDENCIES + activerecord (~> 4.1) + activesupport (~> 4.1) + bcrypt + capybara + factory_girl + faker + gravatarify (~> 3.0.0) + pg + rack-test + rake + rerun + rspec + shotgun + shoulda-matchers + sinatra + sinatra-contrib + sinatra-partial + thin diff --git a/Planning - Schema, Models, and Features.md b/Planning - Schema, Models, and Features.md new file mode 100644 index 0000000..74a13de --- /dev/null +++ b/Planning - Schema, Models, and Features.md @@ -0,0 +1,118 @@ +# Schema + +#### Shoes +* brand +* model +* price +* size + +#### review +* author_id (user_id) +* votes_up +* comment_body +* authors_fit_opinion (it fits their foot well or not) + +#### Users +* foot_profile +* (optional)foot_mature? + +#### Foot_profiles +* size + +#### Votes +* vote_count + +# Models +#### Votes +* uniqueness scope (AR), combination of voter_id & comment_id must be unique + + +#### User +* has_many :review +* belongs_to :foot_profile +* Method to: View all review made by user, linked by shoe image (active record scopes) +* Method to: View total votes up/down + +#### Foot_profile +* has_many :users + +####Shoe +* has many :review +* composite attribute for shoe image based on brand and model naming convention + +#### review +* shoe_id +* author_id +* message + + + + +#Features +* Can view all review for all sizes pertaining to a specifc shoe in character-limited divs. +* Can expand all review on a page with one button. +* Can view all review made by a user + + + + +#Milestones +####Requirements +* Portfolio 1: Sinatra RESTful CRUD +* Portfolio 2: Active Record +* Portfolio 3: Authentication And Authorization +* Portfolio 4: HTML and CSS +* Portfolio 5: Validations and Errors + +####User Stories +* A rock climber can view the site without registering or logging in. +* A rock climber can register for an account and login to leave reviews and vote(?). +* A rock climber can search for shoes. +* A rock climber can read other rock climbers' opinions or reviews of a specific size of a specific model of a shoe. +* A rock climber can leave a review. +* A rock climber must say whether a shoe fits the shape of their particular foot as part of their review. +* A rock climber can add a picture to their review. +* A rock climber can vote on whether another climber's review is helpful. (?) +* A rock climber can see a list of the reviews authored by another rock climber. +* A rock climber can define the profile of their foot, either empirically or with measurements. +* A rock climber can get the profile of their foot by taking specific measurements. +* A rock climber can verify the validity of their measurements by taking a picture of their foot from a specific angle with some reference. +* A rock climber can sort shoes based on the reviews left by rock climbers with similarly shaped feet. +* A rock climber can see a list of prices from different retailers for each shoe. + + +####Deliverables +* Readme.md with running instructions +* **Passion Project A Features & Requirements Chart:** + +| Feature | P1 | P2 | P3 | P4 | P5 | +| ------- | --- | --- | --- | --- | --- | +| | | | | | | + + + + +to-do: +2.8 +add "review written XXX ago" counter +add error handling & validations +add pictures + +2.5 +Test connections with fake seeds in db +Search: ilike(any(array)) (?syntax) + +where(product ilike ANY([? ARRAY])) + +class Question < Posting + has_many :answers + + + def self.search(string) + Question.where("content ILIKE ANY ( array[?] ) OR title ILIKE ANY ( array[?] )", parsed(string), parsed(string)) + end + + def self.parsed(string) + string.tr('^A-Za-z0-9 ', '').split(' ').map {|val| "%#{val}%" } + end +end diff --git a/README copy.md b/README copy.md new file mode 100644 index 0000000..3b221fa --- /dev/null +++ b/README copy.md @@ -0,0 +1,305 @@ +# Sinatra Url Shortener + +## Learning Competencies + +* Test-driven development using rspec and [rack-test][] +* Map the flow of data through a web application +* Use redirect +* Use Active Record callbacks +* Implement a user authorization scheme to limit unauthorized access to specific pages in a web application +* Deploy your application to Heroku + +## Summary + +We're going to build a simple link shortener, a la [bitly][]. + +You'll have one model named `Url`. The table for this model stores a list of +URLs that people have entered. + +## Releases + +### Release 0: Simple Shortener + +Start with the empty Sinatra skeleton. + +We have one resource: `Urls`. For our controllers, we have a route that lists +`Url` objects and another route that, when POSTed to, creates a `Url` object. + +Let's test-drive these routes! + +Create a file in the `spec/` directory that corresponds to your controller. +Maybe call it something like `index_controller_spec.rb`. Open this file in your +editor and write a controller spec for `GET /urls` using the syntax provided by +[rack-test][]. The [Sinatra testing documentation][] also has documentation +about how to test a controller. + +Write a failing test first. After you've made it pass by implementing the route, +write a failing test for the `POST /urls` route. Keep the + +1. Given +2. When +3. Then + +steps in mind, since they'll help you set up the test for your POST route. Here's +the general format for an empty controller test: + +```ruby +require 'spec_helper' +describe "index_controller" do + # specs go here! +end +``` + +We'll also need a route that redirects us to the full (unshortened) URL. As +always, write a test first. If you've never used bitly, use it now to get a +feel for how it works. + +Now that you've written tested controllers, the controller methods should look +like this: + +```ruby +get '/' do + # let user create new short URL, display a list of shortened URLs +end + +post '/urls' do + # create a new Url +end + +# e.g., /q6bda +get '/:short_url' do + # redirect to appropriate "long" URL +end +``` + +Use a `before_save` callback in the `Url` model to generate the short URL. +**Write a test** for the model method you created that generates the short URL, +but don't worry about testing that the `before_save` callback fires. We'll trust +that ActiveRecord has been thoroughly tested. + +### Release 1: Add a Counter! + +Add a `click_count` field to your `urls` table, which keeps track of how many +times someone has visited the shortened URL. Add code to the appropriate place +in your controller code so that any time someone hits a short URL the counter +for the appropriate `Url` is incremented by 1. You can (and should) also write +a test for this. + +### Release 2: User Authentication + +Now it's time for things to get complicated. Let's implement a login and logout +feature for our URL shortener! + +The core flow of the app should remain the same, however a person might choose +to log in or create an account. In the event that they're logged in when they shorten +a URL, this `Url` should now be associated with their user account. In other words, +a `Url` belongs to a `User` and a `User` has many `Urls`. + +**Note**: Don't worry about implement the above user-centric logic yet. First +get all the URL shortening and user authentication code working. **Feel free to +spike on this** and forego TDD while you figure out user authentication, we'll +come back to repair broken tests in a bit. Make sure people can log in and can +shorten URLs regardless of whether they're logged in or not. + +There's going to be a lot going on in your controller! Try to keep the code as +readable and organized as possible. A file structure like this might make sense: + +1. `app/controllers/urls.rb`, which contains the routes related to listing, creating, and redirecting `Url` objects +2. `app/controllers/sessions.rb`, which contains the routes related to logging in and logging out +3. `app/controllers/users.rb`, which contains the routes related to creating, displaying, and editing users + +### Release 3: Conditional Logic + +Now that you've got basic user authentication and URL shortening working, it's +time to stitch these features together. Depending on whether a user is signed +in, your site will change dynamically. + +People should be able to create short URLs regardless of whether they're logged +in or not (that is, the `user_id` field on the `urls` table could possibly be +`NULL`). + +However, if a user *is* logged in, when we create a URL it should set the +`user_id` to whatever the `user_id` of the currently logged-in user is. This +information *should not* be a part of the form that a user submits — it +would be trivial for someone to change the content of the form and submit as +any user. The information should, instead, be stored in the users' sessions. + +Users should now be able to view their URLs on their profile page, which should +look like this: + +```ruby +get '/users/:id' do +end +``` + +This should display a user's profile, which lists all the links that a +particular user has created. If I'm viewing my *own* profile page, show the +number of clicks next to each link so I can see how awesome my link-sharing +skills are. + +Since you'll be checking the session in every route, your routes are probably pretty +repetetive. But theres a better way! You can create helper methods to DRY up your +controller and view code. You could use something like this: + +```ruby +helpers do + # This will return the current user, if they exist + # Replace with code that works with your application + def current_user + if session[:user_id] + @current_user ||= User.find_by_id(session[:user_id]) + end + end + + # Returns true if current_user exists, false otherwise + def logged_in? + !current_user.nil? + end +end +``` + +Your controller can now call `current_user` to get the currently authenticated +user, if they exist. This means we don't have to rely on user-submitted data +to determine what user created a short URL. + + + +### Release 4: Fix Your Broken Tests and Write New Ones! +All of this dynamic content has probably caused your tests to break. But that's +ok! They can be fixed! You can fake a user's session using rack-test. The 'GET' +and 'POST' methods take an optional third argument that corresponds to the +rack environment hash (where information about sessions is stored). It looks +something like this: + +```ruby +it "should create a new post" do + fake_params = { title: "some title", content: "some content" } + fake_session = { 'rack.session' => { user_id: 20 } } + expect{ + post '/some_route', fake_params, fake_session + }.to change{ Post.count }.by(1) +end +``` + +You should also write tests to check each branch of your conditionals (if/else) +that correspond to user authentication. + + +### Release 5: Add Validations (Optional) + +Test-drive adding a validation to your `Url` model so that only `Urls` with +valid URLs are saved to the database. Read up on [ActiveRecord validations][]. +You can use ActiveRecord's `valid?` instance method in your test to check if +the validations are working. + +What constitutes a "valid URL" is up to you. It's a sliding scale, from +validations that would permit lots of invalid URLs to validations that might +reject lots of valid URLs. When you get into it you'll see that expressing the +fact "x is a valid URL" in Ruby Land or SQL Land is never perfect. + +For example, the valid URL could range across: + +**A valid URL is...** + +* Any non-empty string +* Any non-empty string that starts with "http://" or "https://" +* Any string that the [Ruby URI module][URI module] says is valid +* Any URL-looking thing which responds to a HTTP request, i.e., we actually check to see if the URL is accessible via HTTP + +Some of these are easily expressible in SQL Land. Some of these are hard to +express in SQL Land, but ActiveRecord comes with pre-built validation helpers +that make it easy to express in Ruby Land. Others require [custom +validations][] that express logic unique to our application domain. + +The rule of thumb is that where we can, we want to always express constraints +in Ruby Land and also express them in SQL Land where feasible. + + +### Release 6: Add Error Handling (Optional) + +When you try to save (create or update) an ActiveRecord object that has invalid +data, ActiveRecord will fail. Some methods like `create!` and `save!` throw an +exception. Others like `create` (without the `!`, the bang) return the resulting +object whether the object was saved successfully to the database or not, while +`save` will return `false` if `perform_validation` is true and any validations +fail. See [create][] and [save][] for more information. + +Remember, you can call [valid? or invalid?][valid invalid] on an ActiveRecord +object to see whether its data is valid or invalid. + +Use `valid?`, `invalid?`, and the [errors][] method to display a helpful error message if a user +enters an invalid URL. This will give them a change to correct their error. + +## Optimize Your Learning + +### More on Validations, Constraints, and Database Consistency + +We often want to put constraints on what sort of data can go into our database. +This way we can guarantee that all data in the database conforms to certain +standards, e.g., there are no users missing an email address. Guarantees of +this kind — ensuring that the data in our database is never confusing or +contradictory or partially changed or otherwise invalid — are called +**consistency**. + +If we think of this as a fact from Fact Land, these constraints look like: + +* A user must have a first\_name +* A user must have an email +* Two user's can't have the same email address, or equivalently, each user's email must be unique +* A Craigslist post's URL must be a valid URL, for some reasonable definition of valid + +These facts can be recorded in both SQL Land and in Ruby Land, like this: + + + + + + + + + + + + + + + + + + + + + + +
Fact LandSQL LandRuby Land
A user must have an email addressNOT NULL constraint on email fieldvalidates :email, :presence => true
A user must have a first nameNOT NULL constraint on first_name fieldvalidates :first_name, :presence => true
A user's email address must be uniqueUNIQUE INDEX on email fieldvalidates :email, :uniqueness => true
+ +### Release 7: Deployment (Optional) + +You're feature complete with 100% test coverage. It's time to push this thing into +production! Get the app up on Heroku, and call it a night. + +## Resources + +* [Bit.ly, a url shortening service][bitly] +* [ActiveRecord validations][] +* [URI module][] +* [Active record custom validations][custom validations] +* [ActiveRecord create][create] +* [ActiveRecord save][save] +* [ActiveRecord's valid? & invalid?][valid invalid] +* [ActiveRecord's errors object][errors] +* [HTTP status codes][] +* [HTTP status cats][] + +[bitly]: http://bitly.com/ +[ActiveRecord validations]: http://guides.rubyonrails.org/active_record_validations.html +[URI module]: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html +[custom validations]: http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations +[create]: http://apidock.com/rails/ActiveRecord/Base/create/class +[Sinatra testing documentation]: http://www.sinatrarb.com/testing.html#rspec +[save]: http://apidock.com/rails/ActiveRecord/Base/save +[valid invalid]: http://guides.rubyonrails.org/active_record_validations.html#valid-questionmark-and-invalid-questionmark +[errors]: http://guides.rubyonrails.org/active_record_validations.html#validations-overview-errors +[HTTP status codes]: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes +[HTTP status cats]: http://httpcats.herokuapp.com/ +[rack-test]: https://github.com/brynary/rack-test#readme diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..5380f6e --- /dev/null +++ b/Rakefile @@ -0,0 +1,181 @@ +require 'rake' + +require ::File.expand_path('../config/environment', __FILE__) + +# Include all of ActiveSupport's core class extensions, e.g., String#camelize +require 'active_support/core_ext' + +namespace :generate do + + desc "Create RESTful routes for NOUN" + task :controller do + unless ENV.has_key?('NOUN') + raise "Must specify controller name, e.g., rake generate:controller NOUN=category" + end + + require 'active_support/inflector' + noun = ActiveSupport::Inflector.pluralize(ENV['NOUN']) + + file_contents = <<-CONTROLLER +# get a list of #{noun} +get '/#{noun}' do +end +# get a form to add a new #{noun} +get '/#{noun}/new' do +end +# add a new #{noun} +post '/#{noun}' do +end +# get a specific instance of #{noun} +get '/#{noun}/:id' do +end +# get a form to edit a specific instance of #{noun} +get '/#{noun}/:id/edit' do +end +# edit a specific instance of #{noun} +put '/#{noun}/:id' do +end +# delete a specific instance of #{noun} +delete '/#{noun}/:id' do +end + CONTROLLER + controller_path = APP_ROOT.join('app', 'controllers', "#{ENV['NOUN']}.rb") + File.write(controller_path, file_contents) + end + + desc "Create an empty model in app/models, e.g., rake generate:model NAME=User" + task :model do + unless ENV.has_key?('NAME') + raise "Must specificy model name, e.g., rake generate:model NAME=User" + end + + model_name = ENV['NAME'].camelize + model_filename = ENV['NAME'].underscore + '.rb' + model_path = APP_ROOT.join('app', 'models', model_filename) + + if File.exist?(model_path) + raise "ERROR: Model file '#{model_path}' already exists" + end + + puts "Creating #{model_path}" + File.open(model_path, 'w+') do |f| + f.write(<<-EOF.strip_heredoc) + class #{model_name} < ActiveRecord::Base + # Remember to create a migration! + end + EOF + end + end + + desc "Create an empty migration in db/migrate, e.g., rake generate:migration NAME=create_tasks" + task :migration do + unless ENV.has_key?('NAME') + raise "Must specificy migration name, e.g., rake generate:migration NAME=create_tasks" + end + + name = ENV['NAME'].camelize + filename = "%s_%s.rb" % [Time.now.strftime('%Y%m%d%H%M%S'), ENV['NAME'].underscore] + path = APP_ROOT.join('db', 'migrate', filename) + + if File.exist?(path) + raise "ERROR: File '#{path}' already exists" + end + + puts "Creating #{path}" + File.open(path, 'w+') do |f| + f.write(<<-EOF.strip_heredoc) + class #{name} < ActiveRecord::Migration + def change + end + end + EOF + end + end + + desc "Create an empty model spec in spec, e.g., rake generate:spec NAME=user" + task :spec do + unless ENV.has_key?('NAME') + raise "Must specificy migration name, e.g., rake generate:spec NAME=user" + end + + name = ENV['NAME'].camelize + filename = "%s_spec.rb" % ENV['NAME'].underscore + path = APP_ROOT.join('spec', filename) + + if File.exist?(path) + raise "ERROR: File '#{path}' already exists" + end + + puts "Creating #{path}" + File.open(path, 'w+') do |f| + f.write(<<-EOF.strip_heredoc) + require 'spec_helper' + + describe #{name} do + pending "add some examples to (or delete) #{__FILE__}" + end + EOF + end +end + +end + +namespace :db do + desc "Drop, create, and migrate the database" + task :reset => [:drop, :create, :migrate] + + desc "Create the databases at #{DB_NAME}" + task :create do + puts "Creating development and test databases if they don't exist..." + system("createdb #{APP_NAME}_development && createdb #{APP_NAME}_test") + end + + desc "Drop the database at #{DB_NAME}" + task :drop do + puts "Dropping development and test databases..." + system("dropdb #{APP_NAME}_development && dropdb #{APP_NAME}_test") + end + + desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)." + task :migrate do + ActiveRecord::Migrator.migrations_paths << File.dirname(__FILE__) + 'db/migrate' + ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true + ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) do |migration| + ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope) + end + end + + desc "rollback your migration--use STEP=number to step back multiple times" + task :rollback do + step = (ENV['STEP'] || 1).to_i + ActiveRecord::Migrator.rollback('db/migrate', step) + Rake::Task['db:version'].invoke if Rake::Task['db:version'] + end + + desc "Populate the database with dummy data by running db/seeds.rb" + task :seed do + require APP_ROOT.join('db', 'seeds.rb') + generate_shoes + generate_users + generate_reviews + end + + desc "Returns the current schema version number" + task :version do + puts "Current version: #{ActiveRecord::Migrator.current_version}" + end + + namespace :test do + desc "Migrate test database" + task :prepare do + system "rake db:migrate RACK_ENV=test" + end + end +end + +desc 'Start IRB with application environment loaded' +task "console" do + exec "irb -r./config/environment" +end + +task :default => :spec diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/index.rb b/app/controllers/index.rb new file mode 100644 index 0000000..0dca457 --- /dev/null +++ b/app/controllers/index.rb @@ -0,0 +1,63 @@ +get '/session-viewer' do + session.inspect +end + +get '/session-reset' do + session[:user_password] = nil + session[:user_id] = nil + session.inspect +end + +get '/' do + @shoes = ["La Sportiva Solution", "Mad Rock Shark", "Evolv Shaman", "Tenaya Oasi"] + erb :index +end + + + +get '/logout' do + session.clear + redirect '/' +end + +get '/login/?' do + erb :login +end + +get '/login/again' do + erb :login_again +end + +post '/login' do + user = User.find_by(email: params[:email]) + if user.nil? # If email doesn't exist, try again. + redirect '/login/again' + else # If email exists, try to authenticate + if user.authenticate(params[:password]) + session[:user_id] = user.id + session[:user_password] = user.password + redirect "/shoes" + else + redirect '/login/again' + end + end +end + +# get '/register' do + +# erb :register +# end +# ### DEPRECATED, MOVED INTO USER CONTROLLER +# post '/register' do +# if User.find_by(username: params[:username]).nil? && User.find_by(email: params[:email]).nil? +# User.create(username: params[:username], email: params[:email], password_hash: params[:password]) +# user = User.find_by(username: params[:username]) +# session[:user_id] = user.id +# user.password = params[:password] +# user.save +# else +# redirect '/register' #<< partial (: invalid_user ) +# end +# end + +# register login diff --git a/app/controllers/reviews.rb b/app/controllers/reviews.rb new file mode 100644 index 0000000..c5c8d8a --- /dev/null +++ b/app/controllers/reviews.rb @@ -0,0 +1,25 @@ +# get a list of comments +get '/reviews' do +end +# get a form to add a new reviews +get '/reviews/new' do + + erb :new_review +end +# add a new reviews +post '/reviews' do + Review.create(message: params[:message], shoe_id: session[:last_shoe_id], author_id:session[:user_id]) + redirect "/shoes/#{session[:last_shoe_id]}" +end +# get a specific instance of reviews +get '/reviews/:id' do +end +# get a form to edit a specific instance of reviews +get '/reviews/:id/edit' do +end +# edit a specific instance of reviews +put '/reviews/:id' do +end +# delete a specific instance of reviews +delete '/reviews/:id' do +end diff --git a/app/controllers/shoes.rb b/app/controllers/shoes.rb new file mode 100644 index 0000000..219f09e --- /dev/null +++ b/app/controllers/shoes.rb @@ -0,0 +1,38 @@ +# get a list of shoes + +before '/shoes/*' do + # redirect "/login" unless authorized? # in helpers/session.rb +end + +get '/shoes/?' do + erb :shoes +end + +# get '/shoes/:id' do +# @shoe = Shoe.find(params[:id]) +# # erb :shoe_instance +# erb :shoe_instance +# end +# # get a form to edit a specific instance of shoes +get '/shoes/:id/new_review' do + session[:last_shoe_id] = params[:id] + redirect '/reviews/new' +end + +get '/shoes/:display_name' do + keywords = params[:display_name].split(" ").map!{|word| "%"+word+"%"} + matches = Shoe.where('display_name ilike any ( array[?] )', keywords) + matches.to_json +end + +get '/shoesearch' do + keywords = params[:shoeBarInput].split(" ").map!{|word| "%"+word+"%"} + @matches = Shoe.where('display_name ilike any ( array[?] )', keywords) + erb :shoe_list, layout: false +end +# # edit a specific instance of shoes +# put '/shoes/:id' do +# end +# # delete a specific instance of shoes +# delete '/shoes/:id' do +# end diff --git a/app/controllers/users.rb b/app/controllers/users.rb new file mode 100644 index 0000000..25f8846 --- /dev/null +++ b/app/controllers/users.rb @@ -0,0 +1,36 @@ +# get a list of users +get '/users' do +end +# get a form to add a new users +get '/users/new' do + + erb :new_user +end +# add a new users +post '/users' do + session[:errors] = nil + user = User.create(username: params[:username], email: params[:email], password: params[:password]) + if user.errors.any? + session[:errors] = user.display_errors + redirect '/users/new' #<< partial (: invalid_user ) + elsif + session[:user_id] = user.id + session[:user_password] = user.password + redirect '/' + end +end +# get a specific instance of users +get '/users/:username' do + @user = User.find_by(username:params[:username]) + @shoes_with_reviews = @user.shoes_with_reviews(@user.id) + erb :user_profile +end +# get a form to edit a specific instance of users +get '/users/:id/edit' do +end +# edit a specific instance of users +put '/users/:id' do +end +# delete a specific instance of users +delete '/users/:id' do +end diff --git a/app/helpers/.gitkeep b/app/helpers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/helpers/README b/app/helpers/README new file mode 100644 index 0000000..eb4b902 --- /dev/null +++ b/app/helpers/README @@ -0,0 +1,9 @@ +Add helpers here as *.rb files, e.g., + +app/helpers/formatting.rb + +helpers do + def em(text) + "#{text}" + end +end diff --git a/app/helpers/README.md b/app/helpers/README.md new file mode 100644 index 0000000..f3ef772 --- /dev/null +++ b/app/helpers/README.md @@ -0,0 +1,32 @@ +# HELPERS + +## Basics + +Helpers are methods that are defined in a central place but which can be used +inside of your view templates. An example of a helper is shown in +`app/views/index.erb` inside where we use the `em` helper. + +## Adding helpers + +Add helpers here inside of *.rb files inside this directory e.g.: +`app/helpers/formatting.rb`. + +Inside this file define your helpers like: + +``` +helpers do + def em(text) + "#{text}" + end +end +``` + +## Reloading + +After you create new files containing helpers, you must restart the web server +so that your changes are reloaded into the running web server process. This is +because helper files are read *only once* at web-server *startup* time. Also, +if you add a new helper or alter its implementation, you *also* must restart it +so that "sourced" (i.e. read in) anew. Other web frameworks do not require +this restart e.g. Rails but in this starter kit you're best not "bubbling out" +helpers until your implementation has "gelled." diff --git a/app/helpers/navbar.rb b/app/helpers/navbar.rb new file mode 100644 index 0000000..508a3a1 --- /dev/null +++ b/app/helpers/navbar.rb @@ -0,0 +1,16 @@ +def current_user_exist? + !session[:user_id].nil? +end + +def current_user_username + User.find(session[:user_id]).username +end + +def responsive_login_form + if current_user_exist? + return "#{current_user_username}. logout" + else + return "login" + end + +end diff --git a/app/helpers/session.rb b/app/helpers/session.rb new file mode 100644 index 0000000..faa9d98 --- /dev/null +++ b/app/helpers/session.rb @@ -0,0 +1,46 @@ +def authorized? + unless User.find_by(id: session[:user_id]) + p "User not found!"*100 + return false + end + correct_password = User.find(session[:user_id]).password_hash + + if correct_password == session[:user_password] + puts "="*100+"\n passwords match\n"+"="*100 + return true + elsif correct_password != session[:user_password] + puts "="*100 + puts "Passwords don't match." + puts "passwords are:\n correct_password:\n#{correct_password}\n ssesion_password:\n#{session[:user_password]}" + puts "="*100 + return false + else + puts "="*100+"\n what?? helpers\\session.rb \n"+"="*100 + end +end + # _____ + # ,---';;;;;`--. + # ,';;;;;; '''''''`-, + # ; ;;;;,,;;;;;;;;;;;`; + # ` ;;; ; ;;;;;;;;,-'`-; + # ` ;;;;' ;;; ;;;; ,-'~ + # /\ /\ ;' ;;;;;;; ,-' + # ,--`/ ^; ;:;;;; ; + # .' `. ;;;;; `. + # ,' (O) ; ;; ;;;; `. + # (v}' ,' ; ;; ;;;; `. + # `-.--' _,'`. :;;; ;;; : + # _._ ~`---' ,- `.`.;;;;;; ;`. + # /___\ ; ,' : . ;; ;; ;; + # c|##c==-.__; `-. ; ;;;;; ; + # c:##c==,_ ` ,' `-.;;;;;;;; + # `----' `------', `.; ;;;;; + # : __,----. , `.;;;;; + # ,'`. ,' , ' ` ;;;;; + # : `.,' ,` , ,';; + # `._ : ,` ,_,,' + # __,-' `-`_` ____,-' + # Ccc_,----'_`--' _) + # CCcc_,----' + + #WHATUP TWADDY diff --git a/app/helpers/url_helper.rb b/app/helpers/url_helper.rb new file mode 100644 index 0000000..1e5488e --- /dev/null +++ b/app/helpers/url_helper.rb @@ -0,0 +1,7 @@ + +helpers do + def crop_url(url) + url.length > 20 ? url[0..30]+".."+url[-5..-1] : url + end + +end diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/README b/app/models/README new file mode 100644 index 0000000..8316832 --- /dev/null +++ b/app/models/README @@ -0,0 +1,5 @@ +Add your ActiveRecord models here. + +You can create them by being in the application root directory and running, e.g., + +rake generate:model NAME=User diff --git a/app/models/README.md b/app/models/README.md new file mode 100644 index 0000000..12849f7 --- /dev/null +++ b/app/models/README.md @@ -0,0 +1,5 @@ +Add your ActiveRecord models here. + +You can create them by being in the application root directory and running: + +`rake generate:model NAME=User` diff --git a/app/models/foot_profile.rb b/app/models/foot_profile.rb new file mode 100644 index 0000000..074e6d4 --- /dev/null +++ b/app/models/foot_profile.rb @@ -0,0 +1,7 @@ +class FootProfile < ActiveRecord::Base + has_many :users + enum forefoot_width: [ :small, :medium, :large] + enum heel_width: [ :small, :medium, :large] + enum foot_length: [ :small, :medium, :large] + # http://stackoverflow.com/questions/23192516/how-to-use-enumrails-4-1 +end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000..e222bf3 --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,9 @@ +class Review < ActiveRecord::Base + belongs_to :author, class_name: "User", foreign_key: 'author_id' + belongs_to :shoe + has_many :votes + + # def self.serve(shoe_id) + # Shoe.find + # end +end diff --git a/app/models/shoe.rb b/app/models/shoe.rb new file mode 100644 index 0000000..71ba668 --- /dev/null +++ b/app/models/shoe.rb @@ -0,0 +1,16 @@ +class Shoe < ActiveRecord::Base + has_many :reviews + + def generate_display_name + self.display_name = self.brand + " " + self.model + end + + def image_path + path = generate_display_name + path.gsub(" ", "-").gsub("\'", "") + end + + before_save :generate_display_name + + +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..cbae3da --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,52 @@ +class User < ActiveRecord::Base + has_many :reviews , class_name: "Review", foreign_key: "author_id" + belongs_to :foot_profile + + def all_comments + # active record scopes + end + + def upvote_score + # Vote.where() + end + # users.password_hash in the database is a :string + + def password + @password ||= BCrypt::Password.new(password_hash) + end + + def password=(new_password) + @password = BCrypt::Password.create(new_password) + self.password_hash = @password + end + + def authenticate(password) + self.password == password + end + + def shoes_with_reviews(user_id) + user = User.find(user_id) + shoes = user.reviews.map(&:shoe) + reviews = user.reviews + Hash[shoes.zip(reviews)] + end + +# validations +# validates :username, :email, presence: true, uniqueness: true +# validate :valid_email #, on: :create + def valid_email + errors.add :email, "is invalid" unless self.email =~ /\A[\w+]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i + end + + def display_errors + html = [] + self.errors.messages.each_pair do |attribute, errors| + html << "#{attribute}:
" + errors.each do |error| "error" + html << "#{error}
" + end + end + return html.join("") + end + +end diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000..7d0f59c --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,5 @@ +class Vote < ActiveRecord::Base + belongs_to :voter, class_name: "User" + belongs_to :review + +end diff --git a/app/views/.gitkeep b/app/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/footer.erb b/app/views/footer.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/header.erb b/app/views/header.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/index.erb b/app/views/index.erb new file mode 100644 index 0000000..20c86d7 --- /dev/null +++ b/app/views/index.erb @@ -0,0 +1,18 @@ + +
+ Rock Shoe Size Review +
+ <% shoe = @shoes.sample %> + + +
+
+ +
+ +
+ + + + + diff --git a/app/views/layout.erb b/app/views/layout.erb new file mode 100644 index 0000000..d702ac5 --- /dev/null +++ b/app/views/layout.erb @@ -0,0 +1,27 @@ + + + + + + + + + + + + + Rock Shoe Fit Review + + + +
+ <%= yield %> + + + diff --git a/app/views/login.erb b/app/views/login.erb new file mode 100644 index 0000000..e23b257 --- /dev/null +++ b/app/views/login.erb @@ -0,0 +1,7 @@ +
+
+
+
+ +
+
diff --git a/app/views/login_again.erb b/app/views/login_again.erb new file mode 100644 index 0000000..0f71c53 --- /dev/null +++ b/app/views/login_again.erb @@ -0,0 +1,6 @@ +
+
+
+ +
+

Invalid email or password :(

diff --git a/app/views/new_review.erb b/app/views/new_review.erb new file mode 100644 index 0000000..1a24213 --- /dev/null +++ b/app/views/new_review.erb @@ -0,0 +1,4 @@ +
+
+ +
diff --git a/app/views/new_user.erb b/app/views/new_user.erb new file mode 100644 index 0000000..eb953c0 --- /dev/null +++ b/app/views/new_user.erb @@ -0,0 +1,7 @@ +
+
+
+
+ +
+<%= session[:errors] %> diff --git a/app/views/registration.erb b/app/views/registration.erb new file mode 100644 index 0000000..0d94223 --- /dev/null +++ b/app/views/registration.erb @@ -0,0 +1,15 @@ +

Welcome to Twaddy! Let's get you registered.

+ +
+Username:
+ +

+Email:
+ +

+Password:
+ +

+

+ \ No newline at end of file diff --git a/app/views/shoe_instance.erb b/app/views/shoe_instance.erb new file mode 100644 index 0000000..d5ef865 --- /dev/null +++ b/app/views/shoe_instance.erb @@ -0,0 +1,11 @@ +
+

<%= @shoe.brand + " " + @shoe.model %>

+ + Write a new review for the <%= @shoe.brand + " " + @shoe.model %> + <% @shoe.reviews.each do |review| %> +
+

<%= review.updated_at %> <% author_name = User.find(review.author_id).username %><%= author_name %>
+ <%= review.message %>

+
+ <% end %> +
diff --git a/app/views/shoe_list.erb b/app/views/shoe_list.erb new file mode 100644 index 0000000..e8e9390 --- /dev/null +++ b/app/views/shoe_list.erb @@ -0,0 +1,6 @@ + +<% @matches.each_with_index do |shoe, index| %> + +<% end %> diff --git a/app/views/shoes.erb b/app/views/shoes.erb new file mode 100644 index 0000000..8d7180d --- /dev/null +++ b/app/views/shoes.erb @@ -0,0 +1,24 @@ +
+
+ <% Shoe.all.each_slice(2) do |slice| %> + + + + + <% end %> + +
+ <% col = 0 %> + + + <% col = 1 %> + +
+
+
diff --git a/app/views/user_profile.erb b/app/views/user_profile.erb new file mode 100644 index 0000000..9616ef2 --- /dev/null +++ b/app/views/user_profile.erb @@ -0,0 +1,14 @@ +
+

<%= @user.username %>

+ <% @shoes_with_reviews.each_pair do |shoe, review| %> + + <% end %> + + +
diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..e237c67 --- /dev/null +++ b/config.ru @@ -0,0 +1,15 @@ +# Require config/environment.rb +require ::File.expand_path('../config/environment', __FILE__) + +set :app_file, __FILE__ + +configure do + # See: http://www.sinatrarb.com/faq.html#sessions + enable :sessions + set :session_secret, ENV['SESSION_SECRET'] || 'this is a secret shhhhh' + + # Set the views to + set :views, File.join(Sinatra::Application.root, "app", "views") +end + +run Sinatra::Application diff --git a/config/database.rb b/config/database.rb new file mode 100644 index 0000000..08c74b7 --- /dev/null +++ b/config/database.rb @@ -0,0 +1,42 @@ +# Log queries to STDOUT in development +if Sinatra::Application.development? + ActiveRecord::Base.logger = Logger.new(STDOUT) +end + +# Automatically load every file in APP_ROOT/app/models/*.rb, e.g., +# autoload "Person", 'app/models/person.rb' +# +# We have to do this in case we have models that inherit from each other. +# If model Student inherits from model Person and app/models/student.rb is +# required first, it will throw an error saying "Person" is undefined. +# +# With this lazy-loading technique, Ruby will try to load app/models/person.rb +# the first time it sees "Person" and will only throw an exception if +# that file doesn't define the Person class. +# +# See http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html +Dir[APP_ROOT.join('app', 'models', '*.rb')].each do |model_file| + filename = File.basename(model_file).gsub('.rb', '') + autoload ActiveSupport::Inflector.camelize(filename), model_file +end + +# Heroku controls what database we connect to by setting the DATABASE_URL environment variable +# We need to respect that if we want our Sinatra apps to run on Heroku without modification +db = URI.parse(ENV['DATABASE_URL'] || "postgres://localhost/#{APP_NAME}_#{Sinatra::Application.environment}") + +DB_NAME = db.path[1..-1] + +# Note: +# Sinatra::Application.environment is set to the value of ENV['RACK_ENV'] +# if ENV['RACK_ENV'] is set. If ENV['RACK_ENV'] is not set, it defaults +# to :development + +ActiveRecord::Base.establish_connection( + :adapter => db.scheme == 'postgres' ? 'postgresql' : db.scheme, + :host => db.host, + :port => db.port, + :username => db.user, + :password => db.password, + :database => DB_NAME, + :encoding => 'utf8' +) diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..455e1f0 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,48 @@ +# Set up gems listed in the Gemfile. +# See: http://gembundler.com/bundler_setup.html +# http://stackoverflow.com/questions/7243486/why-do-you-need-require-bundler-setup +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) + +# Require gems we care about +require 'rubygems' + +require 'uri' +require 'pathname' + +require 'pg' +require 'active_record' +require 'logger' + +require 'sinatra' +require "sinatra/reloader" if development? + +require 'erb' +require 'faker' if development? +require 'bcrypt' +require 'sinatra/partial' + +# Some helper constants for path-centric logic +APP_ROOT = Pathname.new(File.expand_path('../../', __FILE__)) + +APP_NAME = APP_ROOT.basename.to_s + +configure do + # By default, Sinatra assumes that the root is the file that calls the configure block. + # Since this is not the case for us, we set it manually. + set :root, APP_ROOT.to_path + # See: http://www.sinatrarb.com/faq.html#sessions + enable :sessions + set :session_secret, ENV['SESSION_SECRET'] || 'this is a secret shhhhh' + + # Set the views to + set :views, File.join(Sinatra::Application.root, "app", "views") +end + +# Set up the controllers and helpers +Dir[APP_ROOT.join('app', 'controllers', '*.rb')].each { |file| require file } +Dir[APP_ROOT.join('app', 'helpers', '*.rb')].each { |file| require file } + +# Set up the database and models +require APP_ROOT.join('config', 'database') diff --git a/db/migrate/.gitkeep b/db/migrate/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/db/migrate/20150205194725_create_shoes.rb b/db/migrate/20150205194725_create_shoes.rb new file mode 100644 index 0000000..03be9a5 --- /dev/null +++ b/db/migrate/20150205194725_create_shoes.rb @@ -0,0 +1,13 @@ +class CreateShoes < ActiveRecord::Migration + def change + create_table :shoes do |t| + t.string :brand + t.string :model + t.integer :price + t.integer :size + t.string :display_name + + t.timestamps + end + end +end diff --git a/db/migrate/20150205194733_create_reviews.rb b/db/migrate/20150205194733_create_reviews.rb new file mode 100644 index 0000000..439ef9b --- /dev/null +++ b/db/migrate/20150205194733_create_reviews.rb @@ -0,0 +1,13 @@ +class CreateReviews < ActiveRecord::Migration + def change + create_table :reviews do |t| + t.integer :author_id + t.string :message + t.boolean :fits + t.integer :votes + t.integer :shoe_id + + t.timestamps + end + end +end diff --git a/db/migrate/20150205194741_create_users.rb b/db/migrate/20150205194741_create_users.rb new file mode 100644 index 0000000..e2f2f8e --- /dev/null +++ b/db/migrate/20150205194741_create_users.rb @@ -0,0 +1,12 @@ +class CreateUsers < ActiveRecord::Migration + def change + create_table :users do |t| + t.string :username + t.string :password_hash + t.integer :foot_profile + t.string :email + + t.timestamps + end + end +end diff --git a/db/migrate/20150205194748_create_foot_profiles.rb b/db/migrate/20150205194748_create_foot_profiles.rb new file mode 100644 index 0000000..0e92ff5 --- /dev/null +++ b/db/migrate/20150205194748_create_foot_profiles.rb @@ -0,0 +1,13 @@ +class CreateFootProfiles < ActiveRecord::Migration + def change + create_table :foot_profiles do |t| + t.integer :forefoot_width + t.integer :heel_width + t.integer :foot_length + + t.integer :user_id + + t.timestamps + end + end +end \ No newline at end of file diff --git a/db/migrate/20150205195530_create_votes.rb b/db/migrate/20150205195530_create_votes.rb new file mode 100644 index 0000000..51588c9 --- /dev/null +++ b/db/migrate/20150205195530_create_votes.rb @@ -0,0 +1,11 @@ +class CreateVotes < ActiveRecord::Migration + def change + create_table :votes do |t| + t.integer :vote_count + t.integer :voter_id + t.integer :review_id + + t.timestamps + end + end +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000..3da3151 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,29 @@ +def generate_shoes + shoes = { + "La Sportiva" => ["Solution", "Solution Women's", 'Genius', "Testarossa"], + "Five Ten" => ["Team 5.10", "Blackwing", "Anasazi VCS", 'Dragon'], + "Evolv" => ["Shaman"], + "Scarpa" => ["Instinct VS"], + "Mad Rock" => ["Shark 2.0"], + "Tenaya" => ["Oasi"] + } + + shoes.each_key do |brand| + shoes[brand].each do |model| + Shoe.create(brand: brand, model: model, size: 42) + end + end + +end + +def generate_users(num_users = 10) + num_users.times do + User.create(username: Faker::Internet.user_name, email: Faker::Internet.email) + end +end + +def generate_reviews(num_reviews = 104) + num_reviews.times do + Review.create(author_id: [*1..10].sample, message: Faker::Lorem.sentences(3), shoe_id: [*1..12].sample, fits: [true, false].sample) + end +end diff --git a/mockup/.DS_Store b/mockup/.DS_Store new file mode 100644 index 0000000..da6458e Binary files /dev/null and b/mockup/.DS_Store differ diff --git a/mockup/images/blackwing.jpeg b/mockup/images/blackwing.jpeg new file mode 100644 index 0000000..1c5bff5 Binary files /dev/null and b/mockup/images/blackwing.jpeg differ diff --git a/mockup/images/fugly laceup.jpeg b/mockup/images/fugly laceup.jpeg new file mode 100644 index 0000000..4fa86a3 Binary files /dev/null and b/mockup/images/fugly laceup.jpeg differ diff --git a/mockup/images/instinct vs.jpeg b/mockup/images/instinct vs.jpeg new file mode 100644 index 0000000..aeaf5e6 Binary files /dev/null and b/mockup/images/instinct vs.jpeg differ diff --git a/mockup/images/katana.jpeg b/mockup/images/katana.jpeg new file mode 100644 index 0000000..d27a230 Binary files /dev/null and b/mockup/images/katana.jpeg differ diff --git a/mockup/images/men's solution.jpeg b/mockup/images/men's solution.jpeg new file mode 100644 index 0000000..f6a4649 Binary files /dev/null and b/mockup/images/men's solution.jpeg differ diff --git a/mockup/images/miura vs.jpeg b/mockup/images/miura vs.jpeg new file mode 100644 index 0000000..d72f19d Binary files /dev/null and b/mockup/images/miura vs.jpeg differ diff --git a/mockup/images/tarantula.jpeg b/mockup/images/tarantula.jpeg new file mode 100644 index 0000000..4369b13 Binary files /dev/null and b/mockup/images/tarantula.jpeg differ diff --git a/mockup/images/women's solution.jpeg b/mockup/images/women's solution.jpeg new file mode 100644 index 0000000..d5e63b0 Binary files /dev/null and b/mockup/images/women's solution.jpeg differ diff --git a/passion-project-a.sublime-project b/passion-project-a.sublime-project new file mode 100644 index 0000000..b99e167 --- /dev/null +++ b/passion-project-a.sublime-project @@ -0,0 +1,8 @@ +{ + "folders": + [ + { + "path": "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/passion-project-a" + } + ] +} diff --git a/passion-project-a.sublime-workspace b/passion-project-a.sublime-workspace new file mode 100644 index 0000000..c26f4d9 --- /dev/null +++ b/passion-project-a.sublime-workspace @@ -0,0 +1,640 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "alph", + "alphabet_name_sort" + ], + [ + "stud", + "StudentOrganizer" + ], + [ + "orga", + "organized_names" + ], + [ + "S", + "student_names" + ], + [ + "cookie", + "cookies_from_file" + ], + [ + "Pean", + "PeanutCookie" + ], + [ + "cook", + "cookie_1" + ], + [ + "true", + "true" + ], + [ + "get", + "getAverage" + ], + [ + "array", + "arrayOfScores" + ], + [ + "tes", + "testScores" + ], + [ + "Add", + "addScore" + ], + [ + "see", + "seedlings" + ], + [ + "ga", + "gaeaStatus" + ], + [ + "forest", + "forestStatus" + ], + [ + "hi", + "hippyTears" + ], + [ + "hy", + "hydrationStatus" + ], + [ + "number", + "numberOfSeeds" + ], + [ + "numbe", + "numberOfSeeds" + ], + [ + "num", + "numberOfSeeds" + ], + [ + "clean", + "clean_silverware" + ], + [ + "dia", + "diagonal_2" + ], + [ + "doubl", + "double_every_other" + ], + [ + "i", + "i" + ], + [ + "align", + "vertical-align" + ] + ] + }, + "buffers": + [ + { + "file": "Planning - Schema, Models, and Features.md", + "settings": + { + "buffer_size": 2655, + "line_ending": "Windows" + } + } + ], + "build_system": "", + "command_palette": + { + "height": 357.0, + "selected_items": + [ + [ + "mark", + "Markdown Preview: Preview in Browser" + ], + [ + "table editor", + "Table Editor: Enable for current syntax" + ], + [ + "package", + "Package Control: Install Package" + ], + [ + "previe", + "Markdown Preview: Preview in Browser" + ], + [ + "previ", + "Markdown Preview: Preview in Browser" + ], + [ + "pre", + "Markdown Preview: Preview in Browser" + ], + [ + "preview", + "Markdown Preview: Preview in Browser" + ], + [ + "user", + "Preferences: Settings - User" + ], + [ + "settings", + "Preferences: Package Control Settings – Default" + ], + [ + "ruby", + "Set Syntax: Ruby" + ], + [ + "seeing is", + "Seeing Is Believing: Evaluate Marked Lines" + ], + [ + "seeing is ", + "Seeing Is Believing: Evaluate" + ], + [ + "seeing", + "Seeing Is Believing: Evaluate" + ], + [ + "packag", + "Package Control: Install Package" + ], + [ + "markdown", + "Markdown Preview: Preview in Browser" + ], + [ + "m", + "Markdown Preview: Preview in Browser" + ], + [ + "install", + "Package Control: Install Package" + ], + [ + "markd", + "Markdown Preview: Preview in Browser" + ], + [ + "", + "About" + ], + [ + "markdon", + "Markdown Preview: Preview in Browser" + ], + [ + "markdown preview pre", + "Markdown Preview: Preview in Browser" + ], + [ + "markdown pre", + "Markdown Preview: Preview in Browser" + ] + ], + "width": 536.0 + }, + "console": + { + "height": 51.0 + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "file_history": + [ + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/app/models/shoe.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/app/models/user.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/app/models/vote.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/db/migrate/20150205195530_create_votes.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/db/migrate/20150205194748_create_foot_profiles.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/db/migrate/20150205194725_create_shoes.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/db/migrate/20150205194733_create_reviews.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/app/models/foot_profile.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/app/models/review.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/db/migrate/20150205194741_create_users.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/ph2-pA-week-1-passion-project/Planning - Schema, Models, and Features.md", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/passion-project-a/db/migrate/20150205120043_create_users.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/passion-project-a/README.md", + "/C/users/Adell/Documents/DBC/phase-2 (!!)/week-1/sinatra-url-shortener-challenge/Gemfile", + "/C/users/Adell/Documents/DBC/phase-2 (!!)/week-1/sinatra-url-shortener-challenge/gemfile.lock", + "/C/users/Adell/Documents/DBC/phase-2 (!!)/week-1/sinatra-url-shortener-challenge/Rakefile", + "/C/tools/eventmachine/ext/fastfilereader/extconf.rb", + "/C/tools/eventmachine/ext/extconf.rb", + "/C/tools/eventmachine-1.0.3/ext/fastfilereader/extconf.rb", + "/C/tools/eventmachine-1.0.3/ext/extconf.rb", + "/C/Users/Adell/Documents/DBC/phase-2 (!!)/week-1/passion-project-a/Planning - Schema, Models, and Features.md", + "/C/tools/Ruby200-x64/lib/ruby/gems/2.0.0/gems/eventmachine-1.0.3/ext/project.h", + "/C/tools/Ruby200-x64/lib/ruby/gems/2.0.0/gems/eventmachine-1.0.3/ext/fastfilereader/extconf.rb", + "/C/Ruby-DevKit-mingw64-64-4.7.2-20130224-1432/dk.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-3/burrito_generator/models/burrito_generator.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-3/burrito_generator/burrito_generator.rb", + "/C/Users/Adell/Documents/eyecatchers.me/public_html/css/custom.css", + "/C/Users/Adell/Documents/eyecatchers.me/public_html/index.html", + "/C/Users/Adell/AppData/Roaming/Sublime Text 2/Packages/User/Preferences.sublime-settings", + "/C/Users/Adell/Documents/Ionic/tabApps/www/index.html", + "/C/Users/Adell/Documents/Ionic/tabApps/hooks/README.md", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-2/orange-tree-1-just-oranges-rspec-challenge/source/orange_tree.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-2/orange-tree-1-just-oranges-rspec-challenge/source/orange_tree_spec.rb", + "/C/Users/Adell/AppData/Roaming/npm/node_modules/ionic/bin/ionic", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-2/ruby-flashcards-1-single-deck-challenge/source/flashcards.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/ruby-todos-1-0-core-features-challenge/source/todo_controller.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/ruby-todos-1-0-core-features-challenge/source/todo_list.txt", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/ruby-todos-1-0-core-features-challenge/source/todo_model.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/ruby-todos-1-0-core-features-challenge/source/todo_tests.rb", + "/C/Users/Adell/AppData/Roaming/Sublime Text 2/Packages/Package Control/Package Control.sublime-settings", + "/C/Users/Adell/AppData/Roaming/Sublime Text 2/Packages/Default/Preferences.sublime-settings", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/ruby-todos-1-0-core-features-challenge/source/pseudocode.txt", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/cookies.txt", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/cookie_factory_r0.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/design-drill-object-composition-challenge/cookie_factory.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/cookies-and-ovens.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/design-drill-classical-inheritance-challenge/danimals.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/sudoku-1-modeling-logic-challenge/source/sudoku.rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/sudoku-1-modeling-logic-challenge/board_images/printable_board.pdf", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/todo_list(testing example).rb", + "/C/Users/Adell/Documents/DBC/phase-1-unit-1/week-1/todo_list_spec.rb", + "/C/Users/Adell/documents/dbc/phase-1-unit-1/week-1/design-drill-method-chaining-challenge/source/method_chaining.rb", + "/C/Users/Adell/AppData/Roaming/Sublime Text 2/Packages/User/Ruby.sublime-settings", + "/C/Users/Adell/AppData/Roaming/Sublime Text 2/Packages/User/JSON.sublime-settings", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/ruby/fizz-buzz/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/translate-to-js/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/translate-to-js/my_solution.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/jquery/jquery_example.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/groceryList/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/jquery/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/2-JavaScript/jquery/jquery_example.html", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/ruby/rectangle-class/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/3-ruby.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-9/1-professional-blog.md", + "/C/Users/Adell/Downloads/Release.txt", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/9-gps3-2/our_solution.js", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/c8-conflict.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/c5-feedback.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/t8-tech.html", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/7-technical-blog.md", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/c7-values.html", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/5-ruby.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/3-js-gradebook/README.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/3-js-gradebook/my_solution.js", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/4-js-tally-votes/my_solution.js", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/week-7/4-manipulating-js-objects/my_solution.js", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/4-js-tally-votes/README.md", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/stylesheets/blog_template_stylesheet.css", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/stylesheets/cheat-sheet.css", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/cheat-sheet.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/portfolio.html", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/6-cheat-sheet.md", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/week-8/4-js-tally-votes/test.js", + "/C/Users/Adell/Documents/DBC/phase-0-gps-1/awesome_page.md", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/9-gps1-2/gps1-2.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/t4-enumerable-methods.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/cheat-sheat.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/t2-css-design.html", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/2-more-schemas/README.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/2-more-schemas/my_solution.md", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/week-7/9-gps3-1/our_solution.rb", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/week-9/2-JavaScript/groceryList/my_solution.js", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/1-intro-to-databases/README.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/1-intro-to-databases/my_solution.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/1-intro-to-databases/conventions.md", + "/C/Users/Adell/documents/DBC/phase-0-unit-3/week-8/README.md", + "/C/Users/Adell/Documents/DBC/phase-0-unit-3/week-8/1-intro-to-databases/conventions.md", + "/D/Downloads/Warez/DxO Optics Pro 10.0.0 Build 821 Elite Multilingual (x64) + Patch/Patch/Instructions.txt", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/7-technical-blog.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/6-group-project/my_solution.js", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/t7-JavaScript.html", + "/C/Users/Adell/Documents/DBC/adellhk.github.io/blog/c6-stereotype-threat.html", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/4-manipulating-js-objects/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/5-design-cc-mission-solo-challenge/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/5-design-cc-mission-solo-challenge/my_solution.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/6-group-project/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/6-group-project/tests.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/4-manipulating-js-objects/my_solution.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/3-js-variables-objects/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/3-js-variables-objects/my_solution.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/2-eloquent-js/javascript_notes.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/2-eloquent-js/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/2-eloquent-js/my_solutions.js", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/9-gps3-1/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/9-gps3-1/our_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/1-code-combat/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-3/week-7/1-code-combat/my_solution.js", + "/C/Users/Adell/Documents/DBC/phase-0-unit-2/week-5/6-validate-credit-card/my_solution.rb", + "/C/Users/Adell/Documents/DBC/phase-0-unit-2/week-4/5-nums-commas-solo-challenge/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/10-BONUS-challenges/assert-statements/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/1-drawer-debugger/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/5-refactoring/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/5-refactoring/readme.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/10-BONUS-challenges/assert-statements/README.md", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/1-drawer-debugger/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/4-bingo-2-solo-challenge/my_solution.rb", + "/C/Users/Adell/Documents/DBC/phase-0-unit-1/week-3/exercises/12-smallest-integer/my_solution.rb", + "/C/Users/Adell/documents/dbc/phase-0-unit-2/week-6/8-gps2-2/my_solution.rb" + ], + "find": + { + "height": 34.0 + }, + "find_in_files": + { + "height": 0.0, + "where_history": + [ + "C:\\Users\\Adell\\Documents\\,C:\\Users\\Adell\\Documents\\DBC\\adellhk.github.io", + "C:\\Users\\Adell\\Documents\\,C:\\Users\\Adell\\Documents\\eyecatchers.me\\grokphoto-master", + "C:\\Users\\Adell\\Documents\\DBC", + "C:\\Users\\Adell\\Documents\\DBC\\adellhk.github.io\\blog" + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "Comments", + "user", + "-", + "p ", + "names", + "focus", + "gluten", + "[", + "3351", + "3246", + "3230", + "Kanako Gage", + "12/14", + "book now", + "height=\"375\" width=\"300\"", + "commercial", + "11/25/14", + "Ben Owen", + "console.log", + "text = ", + "text =", + "Johnoveau is", + "gaea", + "\"Bingo!\"", + "\"Next\"<", + "\"file\"", + "Proc", + "Bloc", + "Lambda", + "lambda", + "proc", + " [", + "$arr", + "1/24", + "329", + "Ben Owen", + "Eyecatchers2014", + "328", + " Look", + "Corporate", + "comemrcial", + "\"CHameria Law", + "Friendly ", + "personal commercial", + "", + "", + "", + "", + "message", + "argumentError", + "hungry_mouths", + "coded_let", + " x", + "num_of_foo", + "remainder", + "about", + "adell", + "", + "", + "block", + "pre>", + "arr", + "\"", + " \",", + "324-1-2", + "324-", + "services", + "col-md-3 col-xs-6", + "price", + "\">\n", + "bcrypt", + "growth mindset", + "href=\"portfolio", + "shortest_word", + "src=\"../imgs", + "src=\"..imgs", + "src=\"imgs", + "src=\"../imgs\"", + "src=\"imgs", + "src=\"imgs\"", + "your", + "public" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + "review", + "*", + "3460-edit", + "3351", + "3358", + "Randy Kusharsky", + "12/16", + "", + "On-Location", + "12/14/14", + "Kanako Gage", + "return", + "console.log(", + "You are", + "gaeaStatus", + "true", + "Next<", + "proc", + "bloc", + "lambda", + "Lambda", + "Proc", + " @board[", + "@arr", + "1/21", + "1/25", + "325", + "Naomi Mack", + "Eyecatchers-2014", + "329", + "", + "Commercial", + "\"Ben Owen", + "", + "Lifestyle", + "", + "", + "", + "", + "massage", + "num_of_people", + " coded_letter", + "hungry_mouths", + "", + "block", + "inline-pre>", + "result", + "", + "col-lg-2 col-md-3 col-sm-4 col-xs-6", + "service", + "href=\"../portfolio", + "longest_string", + "src=\"/imgs", + "src=\"../imgs", + "src=\"../imgs\"" + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "sheets": + [ + ] + }, + { + "selected": 0, + "sheets": + [ + { + "buffer": 0, + "file": "Planning - Schema, Models, and Features.md", + "settings": + { + "buffer_size": 2655, + "regions": + { + }, + "selection": + [ + [ + 0, + 0 + ] + ], + "settings": + { + "syntax": "Packages/Markdown/Markdown.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 40.0 + }, + "input": + { + "height": 35.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ], + [ + 1, + 0, + 2, + 1 + ] + ], + "cols": + [ + 0.0, + 0.5, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.exec": + { + "height": 297.0 + }, + "replace": + { + "height": 252.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "selected_items": + [ + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "selected_items": + [ + ], + "width": 0.0 + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 342.0, + "status_bar_visible": true +} diff --git a/public/.DS_Store b/public/.DS_Store new file mode 100644 index 0000000..1f22f1d Binary files /dev/null and b/public/.DS_Store differ diff --git a/public/Thumbs.db b/public/Thumbs.db new file mode 100644 index 0000000..839b71f Binary files /dev/null and b/public/Thumbs.db differ diff --git a/public/css/animate.css b/public/css/animate.css new file mode 100644 index 0000000..f784ce8 --- /dev/null +++ b/public/css/animate.css @@ -0,0 +1,3158 @@ +@charset "UTF-8"; +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2014 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +@-webkit-keyframes bounce { + 0%, 20%, 53%, 80%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + 0%, 20%, 53%, 80%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + -ms-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + 0%, 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + 0%, 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + 100% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + 100% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + -ms-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + 0% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + 0% { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes bounceIn { + 0%, 20%, 40%, 60%, 80%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + 0%, 20%, 40%, 60%, 80%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounceInDown { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + 0%, 60%, 75%, 90%, 100% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-animation-duration: .75s; + animation-duration: .75s; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + 0% { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + 0% { + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + 0% { + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + 0% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + 0% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + 0% { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 100% { + opacity: 0; + } +} + +@keyframes zoomOut { + 0% { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 100% { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + 0% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes slideInDown { + 0% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + 0% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInLeft { + 0% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + 0% { + -webkit-transform: translateX(100%); + transform: translateX(100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInRight { + 0% { + -webkit-transform: translateX(100%); + transform: translateX(100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes slideInUp { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + visibility: visible; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateY(100%); + transform: translateY(100%); + } +} + +@keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateY(100%); + transform: translateY(100%); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } +} + +@keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} + +@keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } +} + +@keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + visibility: hidden; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} diff --git a/public/css/application.css b/public/css/application.css new file mode 100644 index 0000000..2e09be6 --- /dev/null +++ b/public/css/application.css @@ -0,0 +1,183 @@ +html, +body { + font-family: sans-serif; + text-align: center; + padding: 0; + margin: 0; +} + +#container { + margin: auto; + position: relative; + min-height: auto; + width: auto; + background: white; + opacity: .8; + display: block; + text-align: center; +} +.content { + padding-top: 15%; + /*margin-top: 3em;*/ + min-height: auto; +} +th { + text-align: left; +} + +a.button { + background: rgb(225,124,123); + color: white; + padding: 20px; + text-decoration: none; + display: inline-block; + font-size: 50px; + border-radius: 10px; +} + +div.header { + background: rgb(149,82,81); + height: 45px; + width: 100%; + position: relative; +} + +div.central { + position: absolute; + top: 50%; + left: 50%; + margin-top: -200px; + height: 400px; + margin-left: -300px; + width: 600px; + text-align: center; +} + +div#searchResults { +border: 1px solid black; +bottom: 25%; +position: fixed; +width: 400px; +margin-left: calc(50% - 200px); +padding: 10px; +} + +div.results { + height: 50px; + border: 1px solid black; +border-radius: 5px; +width: 25%; +margin: 10px; +} + +#footer { + position: absolute; + width: 100%; + height: 3em; + background: rgba(9, 41, 2, 1); +} + +#new_user { + margin-top: 15em; +} + +#shoes { + text-align: left; + font-size: 2em; +} +a { + color: #030F01; +} +a:hover { + color: #BEB04B; +} +@font-face { + font-family: 'LeagueGothicRegular'; + src: url(../../imgs/League-Gothic/LeagueGothic-Regular.otf); +} +.title{ + text-shadow: 0px 1px 1px rgba(2,8,0,0.5); + color: rgba(8,38,2,0.5); + font-family: 'LeagueGothicRegular'; + font-size: 5em; + margin-top: 0; margin-bottom: 0; +} +.title:hover{ + color: rgba(8,38,2,1); +} +.subtitle{ + text-shadow: 0px 1px 1px #1C9A16; + color: #1C8B16; + font-family: 'LeagueGothicRegular'; + font-size: 3em; +} +#navbar { + margin: auto; + position: relative; + height: 100%; + /*min-height: 100%;*/ + width: 75%; + background: rgba(9, 41, 2, 0.6); + opacity: .8; + display: block; + /*padding: 0px 20px 20px 20px;*/ +} +#navbar a,p{ + color: beige; +} +#navbar a:hover{ + color: #BEB04B; +} +.review { + color: rgba(8,38,2,0.5); + + margin:auto; + width:90%; + /*background: rgba(9, 41, 2, 0.6);*/ + border-radius: 5px; + border: 2px solid rgb(9,41,2); + margin-bottom: 3em; + font-size: 1.5em; +} +#shoe p { + text-align: left; + font-size: 1.25em; +} + +.shoe_pane { + position:relative; + width: 10em; +} +.shoe_pane img{ + width: 100%; + display: inline-block; +} +.shoe_pane:after { + position:absolute; + width:100%; height:100%; + top:0; left:0; + background:rgba(0,0,0,0.6); + opacity:0; + transition: all 1s; + -webkit-transition: all 1s; +} +.shoe_pane:hover:after { + opacity: 1; +} + +#shoes { + text-align: center; +} +.shoe_pane a { + font-size: .7em; + text-decoration: none; +} +#shoe_table { + margin:auto; +} + +.thumbnail { + width: 10%; + border-radius: 5px; +} +/*https://color.adobe.com/create/color-wheel/?base=2&rule=Analogous&selected=2&name=My%20Color%20Theme&mode=rgb&rgbvalues=0.9035260443526146,0.9038915488332979,0.903921568627451,0.06463399171987551,0.6939215686274509,0.39354344846038036,0.10959220363431856,0.6039215686274509,0.086447193010976,0.5263261507257542,0.6939215686274509,0.06463399171987551,0.7290196078431372,0.6754610157794895,0.2904771081896126&swatchOrder=0,1,2,3,4*/ diff --git a/public/css/normalize.css b/public/css/normalize.css new file mode 100644 index 0000000..a9c6f52 --- /dev/null +++ b/public/css/normalize.css @@ -0,0 +1,396 @@ +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 8/9. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 8/9. + */ + +audio, +canvas, +video { + display: inline-block; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari 5, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre-wrap; +} + +/** + * Set consistent quote types. + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9. + */ + +img { + border: 0; +} + +/** + * Correct overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari 5. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to `content-box` in IE 8/9. + * 2. Remove excess padding in IE 8/9. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..fab98c7 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/imgs/.DS_Store b/public/imgs/.DS_Store new file mode 100644 index 0000000..3db9301 Binary files /dev/null and b/public/imgs/.DS_Store differ diff --git a/public/imgs/League-Gothic/.DS_Store b/public/imgs/League-Gothic/.DS_Store new file mode 100644 index 0000000..77f2354 Binary files /dev/null and b/public/imgs/League-Gothic/.DS_Store differ diff --git a/public/imgs/League-Gothic/LeagueGothic-CondensedItalic.otf b/public/imgs/League-Gothic/LeagueGothic-CondensedItalic.otf new file mode 100755 index 0000000..28d7185 Binary files /dev/null and b/public/imgs/League-Gothic/LeagueGothic-CondensedItalic.otf differ diff --git a/public/imgs/League-Gothic/LeagueGothic-CondensedRegular.otf b/public/imgs/League-Gothic/LeagueGothic-CondensedRegular.otf new file mode 100755 index 0000000..b1e70bd Binary files /dev/null and b/public/imgs/League-Gothic/LeagueGothic-CondensedRegular.otf differ diff --git a/public/imgs/League-Gothic/LeagueGothic-Italic.otf b/public/imgs/League-Gothic/LeagueGothic-Italic.otf new file mode 100755 index 0000000..ce19c0a Binary files /dev/null and b/public/imgs/League-Gothic/LeagueGothic-Italic.otf differ diff --git a/public/imgs/League-Gothic/LeagueGothic-Regular.otf b/public/imgs/League-Gothic/LeagueGothic-Regular.otf new file mode 100755 index 0000000..6cd753f Binary files /dev/null and b/public/imgs/League-Gothic/LeagueGothic-Regular.otf differ diff --git a/public/imgs/League-Gothic/SIL Open Font License.txt b/public/imgs/League-Gothic/SIL Open Font License.txt new file mode 100755 index 0000000..3e21641 --- /dev/null +++ b/public/imgs/League-Gothic/SIL Open Font License.txt @@ -0,0 +1,43 @@ +Copyright (c) 2010, Caroline Hadilaksono & Micah Rich , with Reserved Font Name: "League Gothic". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/public/imgs/Thumbs.db b/public/imgs/Thumbs.db new file mode 100644 index 0000000..2f15c30 Binary files /dev/null and b/public/imgs/Thumbs.db differ diff --git a/public/imgs/follower_table.png b/public/imgs/follower_table.png new file mode 100644 index 0000000..a7dc04e Binary files /dev/null and b/public/imgs/follower_table.png differ diff --git a/public/imgs/schema.png b/public/imgs/schema.png new file mode 100644 index 0000000..63e7a08 Binary files /dev/null and b/public/imgs/schema.png differ diff --git a/public/imgs/shoes/.DS_Store b/public/imgs/shoes/.DS_Store new file mode 100644 index 0000000..2917e3f Binary files /dev/null and b/public/imgs/shoes/.DS_Store differ diff --git a/public/imgs/shoes/Evolv_Shaman_Large.jpg b/public/imgs/shoes/Evolv_Shaman_Large.jpg new file mode 100644 index 0000000..a3ba530 Binary files /dev/null and b/public/imgs/shoes/Evolv_Shaman_Large.jpg differ diff --git a/public/imgs/shoes/Evolv_Shaman_Small.jpg b/public/imgs/shoes/Evolv_Shaman_Small.jpg new file mode 100644 index 0000000..a3ba530 Binary files /dev/null and b/public/imgs/shoes/Evolv_Shaman_Small.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Anasazi-VCS_Large.jpg b/public/imgs/shoes/Five-Ten_Anasazi-VCS_Large.jpg new file mode 100644 index 0000000..cc3649c Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Anasazi-VCS_Large.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Anasazi-VCS_Small.jpg b/public/imgs/shoes/Five-Ten_Anasazi-VCS_Small.jpg new file mode 100644 index 0000000..fb52ecc Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Anasazi-VCS_Small.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Blackwing_Large.jpg b/public/imgs/shoes/Five-Ten_Blackwing_Large.jpg new file mode 100644 index 0000000..bb49cf5 Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Blackwing_Large.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Blackwing_Small.jpg b/public/imgs/shoes/Five-Ten_Blackwing_Small.jpg new file mode 100644 index 0000000..32812cf Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Blackwing_Small.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Dragon_Small.jpg b/public/imgs/shoes/Five-Ten_Dragon_Small.jpg new file mode 100644 index 0000000..4679ae0 Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Dragon_Small.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Team-5.10_Large.jpg b/public/imgs/shoes/Five-Ten_Team-5.10_Large.jpg new file mode 100644 index 0000000..37a6910 Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Team-5.10_Large.jpg differ diff --git a/public/imgs/shoes/Five-Ten_Team-5.10_Small.jpg b/public/imgs/shoes/Five-Ten_Team-5.10_Small.jpg new file mode 100644 index 0000000..8395926 Binary files /dev/null and b/public/imgs/shoes/Five-Ten_Team-5.10_Small.jpg differ diff --git a/public/imgs/shoes/Five_Ten_Dragon_Large.jpg b/public/imgs/shoes/Five_Ten_Dragon_Large.jpg new file mode 100644 index 0000000..d74499a Binary files /dev/null and b/public/imgs/shoes/Five_Ten_Dragon_Large.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Genius_Large.jpg b/public/imgs/shoes/La-Sportiva_Genius_Large.jpg new file mode 100644 index 0000000..2caf33b Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Genius_Large.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Genius_Small.jpg b/public/imgs/shoes/La-Sportiva_Genius_Small.jpg new file mode 100644 index 0000000..dc306b5 Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Genius_Small.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Solution-Womens_Large.jpg b/public/imgs/shoes/La-Sportiva_Solution-Womens_Large.jpg new file mode 100644 index 0000000..4f84ba1 Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Solution-Womens_Large.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Solution-Womens_Small.jpg b/public/imgs/shoes/La-Sportiva_Solution-Womens_Small.jpg new file mode 100644 index 0000000..0b0c0a6 Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Solution-Womens_Small.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Solution_Large.jpg b/public/imgs/shoes/La-Sportiva_Solution_Large.jpg new file mode 100644 index 0000000..f620ebf Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Solution_Large.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Solution_Small.jpg b/public/imgs/shoes/La-Sportiva_Solution_Small.jpg new file mode 100644 index 0000000..de1bafc Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Solution_Small.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Testarossa_Large.jpg b/public/imgs/shoes/La-Sportiva_Testarossa_Large.jpg new file mode 100644 index 0000000..d145969 Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Testarossa_Large.jpg differ diff --git a/public/imgs/shoes/La-Sportiva_Testarossa_Small.jpg b/public/imgs/shoes/La-Sportiva_Testarossa_Small.jpg new file mode 100644 index 0000000..d0cadf8 Binary files /dev/null and b/public/imgs/shoes/La-Sportiva_Testarossa_Small.jpg differ diff --git a/public/imgs/shoes/Mad-Rock_Shark-2.0_Large.jpg b/public/imgs/shoes/Mad-Rock_Shark-2.0_Large.jpg new file mode 100644 index 0000000..7aaf3ab Binary files /dev/null and b/public/imgs/shoes/Mad-Rock_Shark-2.0_Large.jpg differ diff --git a/public/imgs/shoes/Mad-Rock_Shark-2.0_Small.jpg b/public/imgs/shoes/Mad-Rock_Shark-2.0_Small.jpg new file mode 100644 index 0000000..f134128 Binary files /dev/null and b/public/imgs/shoes/Mad-Rock_Shark-2.0_Small.jpg differ diff --git a/public/imgs/shoes/Scarpa_Instinct-VS_Large.jpg b/public/imgs/shoes/Scarpa_Instinct-VS_Large.jpg new file mode 100644 index 0000000..23961b2 Binary files /dev/null and b/public/imgs/shoes/Scarpa_Instinct-VS_Large.jpg differ diff --git a/public/imgs/shoes/Scarpa_Instinct-VS_Large.png b/public/imgs/shoes/Scarpa_Instinct-VS_Large.png new file mode 100644 index 0000000..4f3fb93 Binary files /dev/null and b/public/imgs/shoes/Scarpa_Instinct-VS_Large.png differ diff --git a/public/imgs/shoes/Scarpa_Instinct-VS_Small.jpg b/public/imgs/shoes/Scarpa_Instinct-VS_Small.jpg new file mode 100644 index 0000000..060693e Binary files /dev/null and b/public/imgs/shoes/Scarpa_Instinct-VS_Small.jpg differ diff --git a/public/imgs/shoes/Scarpa_Instinct-VS_Small.png b/public/imgs/shoes/Scarpa_Instinct-VS_Small.png new file mode 100644 index 0000000..9a25c8d Binary files /dev/null and b/public/imgs/shoes/Scarpa_Instinct-VS_Small.png differ diff --git a/public/imgs/shoes/Tenaya_Oasi_Large.jpg b/public/imgs/shoes/Tenaya_Oasi_Large.jpg new file mode 100644 index 0000000..907cf95 Binary files /dev/null and b/public/imgs/shoes/Tenaya_Oasi_Large.jpg differ diff --git a/public/imgs/shoes/Tenaya_Oasi_Small.jpg b/public/imgs/shoes/Tenaya_Oasi_Small.jpg new file mode 100644 index 0000000..3ed4a46 Binary files /dev/null and b/public/imgs/shoes/Tenaya_Oasi_Small.jpg differ diff --git a/public/imgs/shoes/Unformatted/.DS_Store b/public/imgs/shoes/Unformatted/.DS_Store new file mode 100644 index 0000000..4c9e79e Binary files /dev/null and b/public/imgs/shoes/Unformatted/.DS_Store differ diff --git a/public/imgs/shoes/Unformatted/MZ_MiuraVSWmns_865.jpg b/public/imgs/shoes/Unformatted/MZ_MiuraVSWmns_865.jpg new file mode 100644 index 0000000..0670932 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_MiuraVSWmns_865.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_MiuraVS_555.jpg b/public/imgs/shoes/Unformatted/MZ_MiuraVS_555.jpg new file mode 100644 index 0000000..b382f5e Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_MiuraVS_555.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_MiuraWmns_299.jpg b/public/imgs/shoes/Unformatted/MZ_MiuraWmns_299.jpg new file mode 100644 index 0000000..78c2d98 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_MiuraWmns_299.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_Miura_971.jpg b/public/imgs/shoes/Unformatted/MZ_Miura_971.jpg new file mode 100644 index 0000000..0ceb329 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_Miura_971.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_Oxygym_10N.jpg b/public/imgs/shoes/Unformatted/MZ_Oxygym_10N.jpg new file mode 100644 index 0000000..108a6f3 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_Oxygym_10N.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_Oxygym_Wmns_10O.jpg b/public/imgs/shoes/Unformatted/MZ_Oxygym_Wmns_10O.jpg new file mode 100644 index 0000000..f7cf2cc Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_Oxygym_Wmns_10O.jpg differ diff --git a/public/imgs/shoes/Unformatted/MZ_Tarantula_10C.jpg b/public/imgs/shoes/Unformatted/MZ_Tarantula_10C.jpg new file mode 100644 index 0000000..6a01479 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MZ_Tarantula_10C.jpg differ diff --git a/public/imgs/shoes/Unformatted/MiuraVSWmns_865.jpg b/public/imgs/shoes/Unformatted/MiuraVSWmns_865.jpg new file mode 100644 index 0000000..0d205ff Binary files /dev/null and b/public/imgs/shoes/Unformatted/MiuraVSWmns_865.jpg differ diff --git a/public/imgs/shoes/Unformatted/MiuraVS_555.jpg b/public/imgs/shoes/Unformatted/MiuraVS_555.jpg new file mode 100644 index 0000000..f2b6051 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MiuraVS_555.jpg differ diff --git a/public/imgs/shoes/Unformatted/MiuraWmns_299.jpg b/public/imgs/shoes/Unformatted/MiuraWmns_299.jpg new file mode 100644 index 0000000..71a3d26 Binary files /dev/null and b/public/imgs/shoes/Unformatted/MiuraWmns_299.jpg differ diff --git a/public/imgs/shoes/Unformatted/Miura_971.jpg b/public/imgs/shoes/Unformatted/Miura_971.jpg new file mode 100644 index 0000000..03da4d5 Binary files /dev/null and b/public/imgs/shoes/Unformatted/Miura_971.jpg differ diff --git a/public/imgs/shoes/Unformatted/Oxygym_10N.jpg b/public/imgs/shoes/Unformatted/Oxygym_10N.jpg new file mode 100644 index 0000000..b47fc6a Binary files /dev/null and b/public/imgs/shoes/Unformatted/Oxygym_10N.jpg differ diff --git a/public/imgs/shoes/Unformatted/Oxygym_Wmns_10O.jpg b/public/imgs/shoes/Unformatted/Oxygym_Wmns_10O.jpg new file mode 100644 index 0000000..ff0571c Binary files /dev/null and b/public/imgs/shoes/Unformatted/Oxygym_Wmns_10O.jpg differ diff --git a/public/imgs/shoes/Unformatted/Tarantula_10C.jpg b/public/imgs/shoes/Unformatted/Tarantula_10C.jpg new file mode 100644 index 0000000..98f2a20 Binary files /dev/null and b/public/imgs/shoes/Unformatted/Tarantula_10C.jpg differ diff --git a/public/imgs/twaddy-mockup.png b/public/imgs/twaddy-mockup.png new file mode 100644 index 0000000..78ccc68 Binary files /dev/null and b/public/imgs/twaddy-mockup.png differ diff --git a/public/js/.gitkeep b/public/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/js/application.js b/public/js/application.js new file mode 100644 index 0000000..1c84708 --- /dev/null +++ b/public/js/application.js @@ -0,0 +1,31 @@ +$(document).ready(function() { + animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; + + function animate (element, animationName) { + $(element).addClass(animationName).one(animationEnd, function() { + $(this).removeClass(animationName); + }); + } + animate($('.button'), "animated fadeIn") + + $('#shoeBar').submit(function(e){ + e.preventDefault(); + + $.ajax({ + url: '/shoesearch', + type: 'get', + data: $(this).serialize() + // dataType: 'json' + }).done(function(serverData){ + // console.log(serverData) + $('#searchResults').append(serverData) + $.each($('.results'), function( index, result){ + $(result).css('display', 'inline-block'); + animate(result, "animated fadeIn"); + }); + }).fail(function(){ + console.log('Failed') + }) + + }) +}); diff --git a/spec/features/.gitkeep b/spec/features/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/spec/features/home_page_spec.rb b/spec/features/home_page_spec.rb new file mode 100644 index 0000000..22d46d1 --- /dev/null +++ b/spec/features/home_page_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe 'homepage' do + it 'should be ok' do + get "/" + expect(last_response).to be_ok + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..3d429c1 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,23 @@ +require 'rubygems' + +# All our specs should require 'spec_helper' (this file) + +# If RACK_ENV isn't set, set it to 'test'. Sinatra defaults to development, +# so we have to override that unless we want to set RACK_ENV=test from the +# command line when we run rake spec. That's tedious, so do it here. +ENV['RACK_ENV'] ||= 'test' + +require File.expand_path("../../config/environment", __FILE__) + 855169fbfdd4cc00491330c00fdba1ec03e7513a +require 'shoulda-matchers' +require 'rack/test' +# require 'capybara' +# require 'capybara/rspec' + +RSpec.configure do |config| + config.include Rack::Test::Methods +end + +def app + Sinatra::Application +end