diff --git a/.gitignore b/.gitignore index db4bc39..6ea9f26 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ Capfile public/thumbs public/uploads vendor/cache -.idea \ No newline at end of file +.idea +.sass-cache \ No newline at end of file diff --git a/.sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc b/.sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc deleted file mode 100644 index f8a7c61..0000000 Binary files a/.sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc and /dev/null differ diff --git a/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.plupload.queue.scssc b/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.plupload.queue.scssc deleted file mode 100644 index df4cc05..0000000 Binary files a/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.plupload.queue.scssc and /dev/null differ diff --git a/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.ui.plupload.scssc b/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.ui.plupload.scssc deleted file mode 100644 index a9d253b..0000000 Binary files a/.sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.ui.plupload.scssc and /dev/null differ diff --git a/Gemfile b/Gemfile index d6c1456..a0b3297 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,7 @@ gem 'princely' gem 'jquery-rails' gem 'jquery-ui-rails' gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git' +gem 'ajaxful_rating_jquery', :git => 'git://github.com/baxang/ajaxful_rating_jquery.git'#, :branch => 'rails3' gem 'configatron', :git => 'git://github.com/markbates/configatron.git' gem 'plupload-rails', :git => 'git://github.com/bryanmig/plupload-rails.git' gem 'sequel', :git => 'git://github.com/jeremyevans/sequel.git' diff --git a/Gemfile.lock b/Gemfile.lock index 3de58f5..c5f6b62 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,9 @@ +GIT + remote: git://github.com/baxang/ajaxful_rating_jquery.git + revision: b4a2c760cdbad9cd865fb18667d14045018287ed + specs: + ajaxful_rating_jquery (3.0.0.beta3) + GIT remote: git://github.com/bryanmig/plupload-rails.git revision: 6d07d0f7e05d0b3fdc9b03b49d3a7c3aa1cd703b @@ -251,6 +257,7 @@ PLATFORMS ruby DEPENDENCIES + ajaxful_rating_jquery! cancan carrierwave (= 0.6.2) coffee-rails diff --git a/app/assets/images/ajaxful_rating/star.png b/app/assets/images/ajaxful_rating/star.png new file mode 100644 index 0000000..1e58c5d Binary files /dev/null and b/app/assets/images/ajaxful_rating/star.png differ diff --git a/app/assets/images/ajaxful_rating/star_small.png b/app/assets/images/ajaxful_rating/star_small.png new file mode 100644 index 0000000..1ec7f99 Binary files /dev/null and b/app/assets/images/ajaxful_rating/star_small.png differ diff --git a/app/assets/images/rails.png b/app/assets/images/rails.png deleted file mode 100644 index d5edc04..0000000 Binary files a/app/assets/images/rails.png and /dev/null differ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 87ab0a9..75efd5c 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -6,6 +6,7 @@ // //= require jquery //= require jquery_ujs +//= require jquery.easing.1.3 //= require twitter/bootstrap //= require plupload //= require jquery.plupload.queue diff --git a/app/assets/stylesheets/ajaxful_rating.css.scss b/app/assets/stylesheets/ajaxful_rating.css.scss new file mode 100644 index 0000000..d17a8fa --- /dev/null +++ b/app/assets/stylesheets/ajaxful_rating.css.scss @@ -0,0 +1,91 @@ +/* +* Style by Rogie http://www.komodomedia.com/blog/2007/01/css-star-rating-redux/ +*/ + +.ajaxful-rating, +.ajaxful-rating a:hover, +.ajaxful-rating a:active, +.ajaxful-rating a:focus, +.ajaxful-rating .show-value { + background: url("/assets/ajaxful_rating/star.png") left -1000px repeat-x; +} + +.ajaxful-rating { + position: relative; +/*width: 125px; this is setted dynamically */ + height: 25px; + overflow: hidden; + list-style: none; + margin: 0; + padding: 0; + background-position: left top; +} + +.ajaxful-rating li { + display: inline; +} + +.ajaxful-rating a, +.ajaxful-rating span, +.ajaxful-rating .show-value { + position: absolute; + top: 0; + left: 0; + text-indent: -1000em; + height: 25px; + line-height: 25px; + outline: none; + overflow: hidden; + border: none; +} + +.ajaxful-rating a:hover, +.ajaxful-rating a:active, +.ajaxful-rating a:focus { + background-position: left bottom; +} + +/* This section is generated dynamically. +Just add a call to the helper method 'ajaxful_rating_style' within +the head tags in your main layout +.ajaxful-rating .stars-1{ +width: 20%; +z-index: 6; +} +.ajaxful-rating .stars-2{ +width: 40%; +z-index: 5; +} +.ajaxful-rating .stars-3{ +width: 60%; +z-index: 4; +} +.ajaxful-rating .stars-4{ +width: 80%; +z-index: 3; +} +.ajaxful-rating .stars-5{ +width: 100%; +z-index: 2; +} +*/ +.ajaxful-rating .show-value { + z-index: 1; + background-position: left center; +} + +/* smaller star */ +.ajaxful-rating.small { +/*width: 50px; this is setted dynamically */ + height: 10px; +} + +.ajaxful-rating.small, +.ajaxful-rating.small a:hover, +.ajaxful-rating.small a:active, +.ajaxful-rating.small a:focus, +.ajaxful-rating.small .show-value { + background-image: url("/assets/ajaxful_rating/star_small.png"); + line-height: 10px; + height: 10px; +} diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 424cc96..594993b 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -3,4 +3,12 @@ *= require_tree . *= require jquery.plupload.queue *= require bootstrap_and_overrides - */ \ No newline at end of file + */ + +.ajaxful-rating-wrapper{ + float: right; +} + +.view-btn{ + display: inline; +} \ No newline at end of file diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 18d300e..0878ad1 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -4,7 +4,9 @@ class CollectionsController < ApplicationController def index - @collections = Collection.joins(:albums => :photos).group_for.order('collections.title') + @collections = Collection.includes(:albums => :photos).where("photos.id NOT NULL").group_for.order('collections.title') + @popular_photos = Photo.visible.order('rating_average asc').limit(10) + respond_to do |format| format.html format.json { render :json => @collections } @@ -59,5 +61,11 @@ class CollectionsController < ApplicationController redirect_to @collection end end + + def rate + @collection = Collection.find(params[:id]) + @collection.rate(params[:stars], current_user, params[:dimension]) + render :json => {:id => @collection.wrapper_dom_id(params), :width => 125} + end end diff --git a/app/models/album.rb b/app/models/album.rb index 3f0728f..583b7c0 100644 --- a/app/models/album.rb +++ b/app/models/album.rb @@ -1,6 +1,8 @@ class Album < ActiveRecord::Base extend Ext::GroupFor + ajaxful_rateable :stars => 5, :cache_column => :rating_average + has_many :photos, :dependent => :destroy has_many :collection_albums has_many :collections, :through => :collection_albums diff --git a/app/models/collection.rb b/app/models/collection.rb index 666248f..cc728e7 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -1,6 +1,8 @@ class Collection < ActiveRecord::Base extend Ext::GroupFor + ajaxful_rateable :stars => 5, :cache_column => :rating_average + has_many :collection_albums has_many :albums, :through => :collection_albums attr_accessor :album_list diff --git a/app/models/photo.rb b/app/models/photo.rb index 552ab39..755de96 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -1,19 +1,21 @@ class Photo < ActiveRecord::Base extend Ext::GroupFor + ajaxful_rateable :stars => 5, :cache_column => :rating_average + belongs_to :album has_many :photo_tags, :dependent => :destroy has_many :tags, :through => :photo_tags mount_uploader :attachment, FileUploader - before_create :exif_read before_update :exif_write after_create :set_title attr_accessor :tag_list - + + scope :visible, where(:public => true) scope :untouched, :conditions => "photos.description IS NULL AND photos.id NOT IN ( SELECT photo_id FROM photo_tags)", :include => :album scope :previous, lambda { |p,a| { :conditions => ["id < :id AND album_Id = :album ", { :id => p, :album => a } ], :limit => 1, :order => "id DESC"} } scope :next, lambda { |p,a| { :conditions => ["id > :id AND album_Id = :album ", { :id => p, :album => a } ], :limit => 1, :order => "id ASC"} } diff --git a/app/models/rate.rb b/app/models/rate.rb new file mode 100644 index 0000000..4ff8248 --- /dev/null +++ b/app/models/rate.rb @@ -0,0 +1,7 @@ +class Rate < ActiveRecord::Base + belongs_to :rater, :class_name => "User" + belongs_to :rateable, :polymorphic => true + validates_numericality_of :stars, :minimum => 1 + + attr_accessible :rate, :dimension +end diff --git a/app/models/secret_link_observer.rb b/app/models/secret_link_observer.rb new file mode 100644 index 0000000..ede8ccd --- /dev/null +++ b/app/models/secret_link_observer.rb @@ -0,0 +1,7 @@ +class SecretLinkObserver < ActiveRecord::Observer + observe :collection, :album, :photo + + def before_create(record) + record.url = ::SecureRandom.hex(16) + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 780cc4e..ed69172 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,8 @@ class User < ActiveRecord::Base attr_accessible :id, :name, :second_name, :surname, :email, :password, :password_confirmation, :remember_me, :userpic + ajaxful_rater + mount_uploader :userpic, UserpicUploader has_and_belongs_to_many :roles diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index e38b330..6084b5f 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -64,22 +64,38 @@ class FileUploader < CarrierWave::Uploader::Base end end - version :preview do - process :resize_to_fit => [210, 210] + ###################################################################################################################### + # Note + # The default grid system provided in Bootstrap utilizes 12 columns that + # render out at widths of 724px, 940px (default without responsive CSS included), and 1170px. + # Below 767px viewports, the columns become fluid and stack vertically. + + version :middle do + process :resize_to_fit => [724, 500] def store_dir ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end - version :single do - process :resize_to_limit => [950, 950] + version :large do + process :resize_to_fit => [940, 500] def store_dir ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end + version :largest do + process :resize_to_fit => [1170, 500] + + def store_dir + ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" + end + end + ###################################################################################################################### + + # Add a white list of extensions which are allowed to be uploaded, # for images you might use something like this: def extension_white_list diff --git a/app/uploaders/userpic_uploader.rb b/app/uploaders/userpic_uploader.rb index 888b822..0e2e856 100644 --- a/app/uploaders/userpic_uploader.rb +++ b/app/uploaders/userpic_uploader.rb @@ -9,6 +9,13 @@ class UserpicUploader < CarrierWave::Uploader::Base "#{::SecureRandom.hex(8)}#{File.extname(original_filename).downcase}" if original_filename end + version :mini do + process :resize_to_fit => [50, 50] + + def store_dir + "#{ENV['STORAGE_PATH']}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/mini" + end + end version :small do process :resize_to_fit => [100, 100] diff --git a/app/views/collections/index.html.erb b/app/views/collections/index.html.erb index 3c6ea58..478fa3a 100644 --- a/app/views/collections/index.html.erb +++ b/app/views/collections/index.html.erb @@ -1,25 +1,31 @@ -<% @collections.in_groups_of(4).compact.each do |group| %> - <% unless group.compact.empty? %> - - <% end %> -<% end %> +
+ <%= render 'shared/home_slider' %> +
+
+
+
+ <% @collections.in_groups_of(4).each do |group| %> + <% unless group.empty? %> + + <% end %> + <% end %> +
+
+ <%= content_for :action_links do %> diff --git a/app/views/layouts/bootstrap.html.erb b/app/views/layouts/bootstrap.html.erb index 72a800d..defdafc 100644 --- a/app/views/layouts/bootstrap.html.erb +++ b/app/views/layouts/bootstrap.html.erb @@ -6,24 +6,16 @@ <%= render :partial => 'shared/nav_bar' %>
- -
-

Hello, world!

-

This is a template for a simple marketing or informational website. It includes a large callout called the hero - unit and three supporting pieces of content. Use it as a starting point to create something more unique.

-

Learn more »

-
-
+
<%= flash[:notice] %>
<%= yield %>

- diff --git a/app/views/shared/_head.html.erb b/app/views/shared/_head.html.erb index 9ca9ebf..0e4f891 100644 --- a/app/views/shared/_head.html.erb +++ b/app/views/shared/_head.html.erb @@ -33,4 +33,6 @@ <%= favicon_link_tag 'images/favicon.ico', :rel => 'shortcut icon' %> <%= yield :head %> -<%= yield :javascript %> \ No newline at end of file +<%= yield :javascript %> +<%= raw ajaxful_rating_style %> +<%= raw ajaxful_rating_script %> \ No newline at end of file diff --git a/app/views/shared/_home_slider.html.erb b/app/views/shared/_home_slider.html.erb new file mode 100644 index 0000000..2529219 --- /dev/null +++ b/app/views/shared/_home_slider.html.erb @@ -0,0 +1,38 @@ +<%= content_for :head do %> + <%= stylesheet_link_tag "anythingslider/anythingslider" %> + <%= javascript_include_tag "anythingslider/jquery.anythingslider.min" %> + + + + +<% end %> + +
+ +
diff --git a/app/views/shared/_screen_resolution.html.erb b/app/views/shared/_screen_resolution.html.erb new file mode 100644 index 0000000..ad435c5 --- /dev/null +++ b/app/views/shared/_screen_resolution.html.erb @@ -0,0 +1,8 @@ +Click for your screen resolution + + +<%= content_for :action_links do %> + <% if current_user and current_user.has_role?("admin") %> + <%= link_to "New collection", new_collection_path %> + <% end %> +<% end %> \ No newline at end of file diff --git a/assets/images/ajaxful_rating/star.png b/assets/images/ajaxful_rating/star.png new file mode 100644 index 0000000..1e58c5d Binary files /dev/null and b/assets/images/ajaxful_rating/star.png differ diff --git a/assets/images/ajaxful_rating/star_small.png b/assets/images/ajaxful_rating/star_small.png new file mode 100644 index 0000000..1ec7f99 Binary files /dev/null and b/assets/images/ajaxful_rating/star_small.png differ diff --git a/assets/stylesheets/ajaxful_rating.css.scss b/assets/stylesheets/ajaxful_rating.css.scss new file mode 100644 index 0000000..82c8c17 --- /dev/null +++ b/assets/stylesheets/ajaxful_rating.css.scss @@ -0,0 +1,84 @@ +/* +* Style by Rogie http://www.komodomedia.com/blog/2007/01/css-star-rating-redux/ +*/ + +.ajaxful-rating, +.ajaxful-rating a:hover, +.ajaxful-rating a:active, +.ajaxful-rating a:focus, +.ajaxful-rating .show-value{ + background: image-url("ajaxful_rating/star.png") left -1000px repeat-x; +} +.ajaxful-rating{ + position: relative; + /*width: 125px; this is setted dynamically */ + height: 25px; + overflow: hidden; + list-style: none; + margin: 0; + padding: 0; + background-position: left top; +} +.ajaxful-rating li{ display: inline; } +.ajaxful-rating a, +.ajaxful-rating span, +.ajaxful-rating .show-value{ + position: absolute; + top: 0; + left: 0; + text-indent: -1000em; + height: 25px; + line-height: 25px; + outline: none; + overflow: hidden; + border: none; +} +.ajaxful-rating a:hover, +.ajaxful-rating a:active, +.ajaxful-rating a:focus{ + background-position: left bottom; +} + +/* This section is generated dynamically. +Just add a call to the helper method 'ajaxful_rating_style' within +the head tags in your main layout +.ajaxful-rating .stars-1{ +width: 20%; +z-index: 6; +} +.ajaxful-rating .stars-2{ +width: 40%; +z-index: 5; +} +.ajaxful-rating .stars-3{ +width: 60%; +z-index: 4; +} +.ajaxful-rating .stars-4{ +width: 80%; +z-index: 3; +} +.ajaxful-rating .stars-5{ +width: 100%; +z-index: 2; +} +*/ +.ajaxful-rating .show-value{ + z-index: 1; + background-position: left center; +} + +/* smaller star */ +.ajaxful-rating.small{ + /*width: 50px; this is setted dynamically */ + height: 10px; +} +.ajaxful-rating.small, +.ajaxful-rating.small a:hover, +.ajaxful-rating.small a:active, +.ajaxful-rating.small a:focus, +.ajaxful-rating.small .show-value{ + background-image: image-url("ajaxful_rating/star_small.png"); + line-height: 10px; + height: 10px; +} diff --git a/config/application.rb b/config/application.rb index f23ebb4..35780d9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -12,7 +12,7 @@ module Photomix # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/ config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/middleware/) - + config.active_record.observers = :secret_link_observer config.encoding = "utf-8" config.i18n.default_locale = :ru config.time_zone = 'Moscow' diff --git a/config/routes.rb b/config/routes.rb index ec5ec57..4464fee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,6 +14,10 @@ Photomix::Application.routes.draw do resource :account, :controller => :users resources :photos do + member do + post :rate + end + collection do get :untouched post :edit_multiple @@ -22,10 +26,16 @@ Photomix::Application.routes.draw do get :scan end end + resources :albums do + member do + post :rate + end + collection do get :untouched end + resources :tags do resources :photos do collection do @@ -35,6 +45,7 @@ Photomix::Application.routes.draw do end end end + resources :photos do collection do get :untouched @@ -43,7 +54,12 @@ Photomix::Application.routes.draw do end end end + resources :collections do + member do + post :rate + end + resources :albums do resources :photos do collection do diff --git a/db/migrate/20090520163842_create_album.rb b/db/migrate/20090520163842_create_album.rb index 1ef60c0..0471953 100644 --- a/db/migrate/20090520163842_create_album.rb +++ b/db/migrate/20090520163842_create_album.rb @@ -3,6 +3,10 @@ class CreateAlbum < ActiveRecord::Migration create_table :albums do |t| t.string :title, :length => 250, :null => false t.text :description + t.decimal :rating_average, :default => 0, :precision => 6, :scale => 2 + t.string :url + t.boolean :public + t.timestamps end end diff --git a/db/migrate/20090520165238_create_photos.rb b/db/migrate/20090520165238_create_photos.rb index a586066..34f2373 100644 --- a/db/migrate/20090520165238_create_photos.rb +++ b/db/migrate/20090520165238_create_photos.rb @@ -4,6 +4,10 @@ class CreatePhotos < ActiveRecord::Migration t.string :title, :length => 250 t.text :description t.references :album + t.decimal :rating_average, :default => 0, :precision => 6, :scale => 2 + t.string :url + t.boolean :public + t.timestamps end end diff --git a/db/migrate/20090602131321_create_collections.rb b/db/migrate/20090602131321_create_collections.rb index 08c7c3e..b0d197e 100644 --- a/db/migrate/20090602131321_create_collections.rb +++ b/db/migrate/20090602131321_create_collections.rb @@ -3,6 +3,9 @@ class CreateCollections < ActiveRecord::Migration create_table :collections do |t| t.string :title, :null => false t.string :description + t.decimal :rating_average, :default => 0, :precision => 6, :scale => 2 + t.string :url + t.boolean :public, :default => false t.timestamps end diff --git a/db/migrate/20120724213209_create_rates.rb b/db/migrate/20120724213209_create_rates.rb new file mode 100644 index 0000000..d7a5277 --- /dev/null +++ b/db/migrate/20120724213209_create_rates.rb @@ -0,0 +1,18 @@ +class CreateRates < ActiveRecord::Migration + def self.up + create_table :rates do |t| + t.belongs_to :rater + t.belongs_to :rateable, :polymorphic => true + t.integer :stars, :null => false + t.string :dimension + t.timestamps + end + + add_index :rates, :rater_id + add_index :rates, [:rateable_id, :rateable_type] + end + + def self.down + drop_table :rates + end +end diff --git a/db/schema.rb b/db/schema.rb index b04cbb6..9663f95 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,13 +11,16 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20100412220801) do +ActiveRecord::Schema.define(:version => 20120724213209) do create_table "albums", :force => true do |t| - t.string "title", :null => false + t.string "title", :null => false t.text "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.decimal "rating_average", :precision => 6, :scale => 2, :default => 0.0 + t.string "url" + t.boolean "public" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.text "path" t.string "address" t.float "longitude" @@ -38,10 +41,13 @@ ActiveRecord::Schema.define(:version => 20100412220801) do add_index "collection_albums", ["collection_id"], :name => "index_collection_albums_on_collection_id" create_table "collections", :force => true do |t| - t.string "title", :null => false + t.string "title", :null => false t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.decimal "rating_average", :precision => 6, :scale => 2, :default => 0.0 + t.string "url" + t.boolean "public", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end add_index "collections", ["id"], :name => "index_collections_on_id", :unique => true @@ -60,8 +66,11 @@ ActiveRecord::Schema.define(:version => 20100412220801) do t.string "title" t.text "description" t.integer "album_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.decimal "rating_average", :precision => 6, :scale => 2, :default => 0.0 + t.string "url" + t.boolean "public" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.text "path" t.float "longitude" t.float "latitude" @@ -71,6 +80,19 @@ ActiveRecord::Schema.define(:version => 20100412220801) do add_index "photos", ["album_id"], :name => "index_photos_on_album_id" add_index "photos", ["id"], :name => "index_photos_on_id", :unique => true + create_table "rates", :force => true do |t| + t.integer "rater_id" + t.integer "rateable_id" + t.string "rateable_type" + t.integer "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "rates", ["rateable_id", "rateable_type"], :name => "index_rates_on_rateable_id_and_rateable_type" + add_index "rates", ["rater_id"], :name => "index_rates_on_rater_id" + create_table "roles", :force => true do |t| t.string "name" t.datetime "created_at", :null => false diff --git a/db/seeds.rb b/db/seeds.rb index c965c85..7595828 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -19,4 +19,8 @@ user.roles << Role.make!(name: 'admin') 20.times.map { Photo.make! } 10.times.map { CollectionAlbum.make! } +20.times.map{ Rate.make!(:collections) } +20.times.map{ Rate.make!(:albums) } +20.times.map{ Rate.make!(:photos) } + FileUtils.rm_rf "#{Rails.root}/tmp/attachments" diff --git a/test/blueprints.rb b/test/blueprints.rb index 6a53ffc..40b14dd 100644 --- a/test/blueprints.rb +++ b/test/blueprints.rb @@ -20,7 +20,6 @@ User.blueprint { surname { Faker::NameRU.last_name(sex) } confirmed_at { Time.now + rand(1..4) } confirmation_sent_at { Time.now + rand(5..9) } - # TODO migrate from paperclip to carrier_wave userpic { file_name = ::SecureRandom.hex(8) file = open("http://lorempixel.com/800/500/abstract/") @@ -39,11 +38,15 @@ Album.blueprint { title { Faker::Lorem.sentence(rand(3)) } description { Faker::Lorem.sentence } path { "my_album_#{sn}" } + rating_average { rand(1..5) } + public { true } } Collection.blueprint { title { Faker::Lorem.sentence(rand(3)) } description { Faker::Lorem.sentence } + rating_average { rand(1..5) } + public { true } } CollectionAlbum.blueprint { @@ -55,9 +58,11 @@ Photo.blueprint { title { Faker::Lorem.sentence(rand(3)) } description { Faker::Lorem.sentence } album { Album.find(rand(1..20)) } + rating_average { rand(1..5) } + public { true } attachment { file_name = ::SecureRandom.hex(8) - file = open("http://lorempixel.com/800/500/abstract/") + file = open("http://lorempixel.com/1300/1000/people/") if file.kind_of? Tempfile name = File.basename(file.path) FileUtils.move(file.path, "#{Rails.root}/tmp/attachments/#{name}.jpeg") @@ -69,3 +74,22 @@ Photo.blueprint { } } +Rate.blueprint(:collections) { + rateable { Collection.find(rand(1..20)) } + rater { User.find(rand(1..20)) } + stars { rand(1..5) } +} + +Rate.blueprint(:albums) { + rateable { Album.find(rand(1..20)) } + rater { User.find(rand(1..20)) } + stars { rand(1..5) } +} + +Rate.blueprint(:photos) { + rateable { Photo.find(rand(1..20)) } + rater { User.find(rand(1..20)) } + stars { rand(1..5) } +} + + diff --git a/test/unit/secret_link_observer_test.rb b/test/unit/secret_link_observer_test.rb new file mode 100644 index 0000000..7433f58 --- /dev/null +++ b/test/unit/secret_link_observer_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SecretLinkObserverTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/vendor/assets/javascripts/anythingslider/animate.css b/vendor/assets/javascripts/anythingslider/animate.css new file mode 100644 index 0000000..2f0c3c3 --- /dev/null +++ b/vendor/assets/javascripts/anythingslider/animate.css @@ -0,0 +1,3813 @@ +/* +Animate.css - http://daneden.me/animate +LICENSED UNDER THE MIT LICENSE (MIT) + +Copyright (c) 2011 Dan Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +.animated { + -webkit-animation: 1s ease; + -moz-animation: 1s ease; + -ms-animation: 1s ease; + -o-animation: 1s ease; + animation: 1s ease; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -ms-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.hinge { + -webkit-animation: 2s ease; + -moz-animation: 2s ease; + -ms-animation: 2s ease; + -o-animation: 2s ease; + animation: 2s ease; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-moz-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-ms-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-o-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; + -moz-animation-name: flash; + -ms-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-ms-keyframes shake { + 0%, 100% {-ms-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-ms-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-ms-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -ms-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} + 40% {-webkit-transform: translateY(-30px);} + 60% {-webkit-transform: translateY(-15px);} +} + +@-moz-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} + 40% {-moz-transform: translateY(-30px);} + 60% {-moz-transform: translateY(-15px);} +} + +@-ms-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-ms-transform: translateY(0);} + 40% {-ms-transform: translateY(-30px);} + 60% {-ms-transform: translateY(-15px);} +} + +@-o-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} + 40% {-o-transform: translateY(-30px);} + 60% {-o-transform: translateY(-15px);} +} +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-30px);} + 60% {transform: translateY(-15px);} +} + +.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -ms-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% {-webkit-transform: scale(1);} + 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} + 100% {-webkit-transform: scale(1) rotate(0);} +} + +@-moz-keyframes tada { + 0% {-moz-transform: scale(1);} + 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} + 100% {-moz-transform: scale(1) rotate(0);} +} + +@-ms-keyframes tada { + 0% {-ms-transform: scale(1);} + 10%, 20% {-ms-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-ms-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-ms-transform: scale(1.1) rotate(-3deg);} + 100% {-ms-transform: scale(1) rotate(0);} +} + +@-o-keyframes tada { + 0% {-o-transform: scale(1);} + 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} + 100% {-o-transform: scale(1) rotate(0);} +} + +@keyframes tada { + 0% {transform: scale(1);} + 10%, 20% {transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} + 100% {transform: scale(1) rotate(0);} +} + +.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -ms-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } + 20% { -webkit-transform: rotate(15deg); } + 40% { -webkit-transform: rotate(-10deg); } + 60% { -webkit-transform: rotate(5deg); } + 80% { -webkit-transform: rotate(-5deg); } + 100% { -webkit-transform: rotate(0deg); } +} + +@-moz-keyframes swing { + 20% { -moz-transform: rotate(15deg); } + 40% { -moz-transform: rotate(-10deg); } + 60% { -moz-transform: rotate(5deg); } + 80% { -moz-transform: rotate(-5deg); } + 100% { -moz-transform: rotate(0deg); } +} + +@-ms-keyframes swing { + 20% { -ms-transform: rotate(15deg); } + 40% { -ms-transform: rotate(-10deg); } + 60% { -ms-transform: rotate(5deg); } + 80% { -ms-transform: rotate(-5deg); } + 100% { -ms-transform: rotate(0deg); } +} + +@-o-keyframes swing { + 20% { -o-transform: rotate(15deg); } + 40% { -o-transform: rotate(-10deg); } + 60% { -o-transform: rotate(5deg); } + 80% { -o-transform: rotate(-5deg); } + 100% { -o-transform: rotate(0deg); } +} + +@keyframes swing { + 20% { transform: rotate(15deg); } + 40% { transform: rotate(-10deg); } + 60% { transform: rotate(5deg); } + 80% { transform: rotate(-5deg); } + 100% { transform: rotate(0deg); } +} + +.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -ms-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -ms-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { -webkit-transform: translateX(0%); } + 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } + 30% { -webkit-transform: translateX(20%) rotate(3deg); } + 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } + 60% { -webkit-transform: translateX(10%) rotate(2deg); } + 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } + 100% { -webkit-transform: translateX(0%); } +} + +@-moz-keyframes wobble { + 0% { -moz-transform: translateX(0%); } + 15% { -moz-transform: translateX(-25%) rotate(-5deg); } + 30% { -moz-transform: translateX(20%) rotate(3deg); } + 45% { -moz-transform: translateX(-15%) rotate(-3deg); } + 60% { -moz-transform: translateX(10%) rotate(2deg); } + 75% { -moz-transform: translateX(-5%) rotate(-1deg); } + 100% { -moz-transform: translateX(0%); } +} + +@-ms-keyframes wobble { + 0% { -ms-transform: translateX(0%); } + 15% { -ms-transform: translateX(-25%) rotate(-5deg); } + 30% { -ms-transform: translateX(20%) rotate(3deg); } + 45% { -ms-transform: translateX(-15%) rotate(-3deg); } + 60% { -ms-transform: translateX(10%) rotate(2deg); } + 75% { -ms-transform: translateX(-5%) rotate(-1deg); } + 100% { -ms-transform: translateX(0%); } +} + +@-o-keyframes wobble { + 0% { -o-transform: translateX(0%); } + 15% { -o-transform: translateX(-25%) rotate(-5deg); } + 30% { -o-transform: translateX(20%) rotate(3deg); } + 45% { -o-transform: translateX(-15%) rotate(-3deg); } + 60% { -o-transform: translateX(10%) rotate(2deg); } + 75% { -o-transform: translateX(-5%) rotate(-1deg); } + 100% { -o-transform: translateX(0%); } +} + +@keyframes wobble { + 0% { transform: translateX(0%); } + 15% { transform: translateX(-25%) rotate(-5deg); } + 30% { transform: translateX(20%) rotate(3deg); } + 45% { transform: translateX(-15%) rotate(-3deg); } + 60% { transform: translateX(10%) rotate(2deg); } + 75% { transform: translateX(-5%) rotate(-1deg); } + 100% { transform: translateX(0%); } +} + +.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -ms-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(1); } + 50% { -moz-transform: scale(1.1); } + 100% { -moz-transform: scale(1); } +} +@-ms-keyframes pulse { + 0% { -ms-transform: scale(1); } + 50% { -ms-transform: scale(1.1); } + 100% { -ms-transform: scale(1); } +} +@-o-keyframes pulse { + 0% { -o-transform: scale(1); } + 50% { -o-transform: scale(1.1); } + 100% { -o-transform: scale(1); } +} +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} + +.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -ms-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotateY(0); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) rotateY(0); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) rotateY(360deg) scale(.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-ms-keyframes flip { + 0% { + -ms-transform: perspective(400px) rotateY(0); + -ms-animation-timing-function: ease-out; + } + 40% { + -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -ms-animation-timing-function: ease-out; + } + 50% { + -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -ms-animation-timing-function: ease-in; + } + 80% { + -ms-transform: perspective(400px) rotateY(360deg) scale(.95); + -ms-animation-timing-function: ease-in; + } + 100% { + -ms-transform: perspective(400px) scale(1); + -ms-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) rotateY(0); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) rotateY(360deg) scale(.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) rotateY(0); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) rotateY(360deg) scale(.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) scale(1); + animation-timing-function: ease-in; + } +} + +.flip { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -ms-backface-visibility: visible !important; + -ms-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-ms-keyframes flipInX { + 0% { + -ms-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -ms-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -ms-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -ms-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + transform: perspective(400px) rotateX(10deg); + } + + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -ms-backface-visibility: visible !important; + -ms-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-ms-keyframes flipOutX { + 0% { + -ms-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -ms-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -ms-animation-name: flipOutX; + -ms-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-ms-keyframes flipInY { + 0% { + -ms-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -ms-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -ms-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -ms-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + transform: perspective(400px) rotateY(10deg); + } + + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -ms-backface-visibility: visible !important; + -ms-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-ms-keyframes flipOutY { + 0% { + -ms-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -ms-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -ms-backface-visibility: visible !important; + -ms-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-ms-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-o-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -ms-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-ms-keyframes fadeInUp { + 0% { + opacity: 0; + -ms-transform: translateY(20px); + } + + 100% { + opacity: 1; + -ms-transform: translateY(0); + } +} + +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -ms-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-ms-keyframes fadeInDown { + 0% { + opacity: 0; + -ms-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -ms-transform: translateY(0); + } +} + +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -ms-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -ms-transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -ms-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-ms-keyframes fadeInLeft { + 0% { + opacity: 0; + -ms-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -ms-transform: translateX(0); + } +} + +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -ms-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-ms-keyframes fadeInRight { + 0% { + opacity: 0; + -ms-transform: translateX(20px); + } + + 100% { + opacity: 1; + -ms-transform: translateX(0); + } +} + +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -ms-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-ms-keyframes fadeInUpBig { + 0% { + opacity: 0; + -ms-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -ms-transform: translateY(0); + } +} + +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -ms-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-ms-keyframes fadeInDownBig { + 0% { + opacity: 0; + -ms-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -ms-transform: translateY(0); + } +} + +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -ms-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-ms-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -ms-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -ms-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -ms-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-ms-keyframes fadeInRightBig { + 0% { + opacity: 0; + -ms-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -ms-transform: translateX(0); + } +} + +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -ms-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-moz-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-ms-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-o-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -ms-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-ms-keyframes fadeOutUp { + 0% { + opacity: 1; + -ms-transform: translateY(0); + } + + 100% { + opacity: 0; + -ms-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-20px); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -ms-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} + +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} + +@-ms-keyframes fadeOutDown { + 0% { + opacity: 1; + -ms-transform: translateY(0); + } + + 100% { + opacity: 0; + -ms-transform: translateY(20px); + } +} + +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -ms-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} + +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} + +@-ms-keyframes fadeOutLeft { + 0% { + opacity: 1; + -ms-transform: translateX(0); + } + + 100% { + opacity: 0; + -ms-transform: translateX(-20px); + } +} + +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-20px); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -ms-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} + +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} + +@-ms-keyframes fadeOutRight { + 0% { + opacity: 1; + -ms-transform: translateX(0); + } + + 100% { + opacity: 0; + -ms-transform: translateX(20px); + } +} + +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(20px); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -ms-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-ms-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -ms-transform: translateY(0); + } + + 100% { + opacity: 0; + -ms-transform: translateY(-2000px); + } +} + +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -ms-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-ms-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -ms-transform: translateY(0); + } + + 100% { + opacity: 0; + -ms-transform: translateY(2000px); + } +} + +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -ms-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-ms-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -ms-transform: translateX(0); + } + + 100% { + opacity: 0; + -ms-transform: translateX(-2000px); + } +} + +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -ms-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-ms-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -ms-transform: translateX(0); + } + + 100% { + opacity: 0; + -ms-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -ms-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + } + + 100% { + -webkit-transform: scale(1); + } +} + +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(.3); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + + 70% { + -moz-transform: scale(.9); + } + + 100% { + -moz-transform: scale(1); + } +} + +@-ms-keyframes bounceIn { + 0% { + opacity: 0; + -ms-transform: scale(.3); + } + + 50% { + opacity: 1; + -ms-transform: scale(1.05); + } + + 70% { + -ms-transform: scale(.9); + } + + 100% { + -ms-transform: scale(1); + } +} + +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(.3); + } + + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + + 70% { + -o-transform: scale(.9); + } + + 100% { + -o-transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(.3); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 70% { + transform: scale(.9); + } + + 100% { + transform: scale(1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -ms-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + + 80% { + -moz-transform: translateY(10px); + } + + 100% { + -moz-transform: translateY(0); + } +} +@-ms-keyframes bounceInUp { + 0% { + opacity: 0; + -ms-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -ms-transform: translateY(-30px); + } + + 80% { + -ms-transform: translateY(10px); + } + + 100% { + -ms-transform: translateY(0); + } +} + +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + + 80% { + -o-transform: translateY(10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 60% { + opacity: 1; + transform: translateY(-30px); + } + + 80% { + transform: translateY(10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -ms-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + + 80% { + -moz-transform: translateY(-10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-ms-keyframes bounceInDown { + 0% { + opacity: 0; + -ms-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -ms-transform: translateY(30px); + } + + 80% { + -ms-transform: translateY(-10px); + } + + 100% { + -ms-transform: translateY(0); + } +} + +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + + 80% { + -o-transform: translateY(-10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + transform: translateY(30px); + } + + 80% { + transform: translateY(-10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -ms-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + + 80% { + -moz-transform: translateX(-10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-ms-keyframes bounceInLeft { + 0% { + opacity: 0; + -ms-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -ms-transform: translateX(30px); + } + + 80% { + -ms-transform: translateX(-10px); + } + + 100% { + -ms-transform: translateX(0); + } +} + +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + + 80% { + -o-transform: translateX(-10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + transform: translateX(30px); + } + + 80% { + transform: translateX(-10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -ms-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + + 80% { + -moz-transform: translateX(10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-ms-keyframes bounceInRight { + 0% { + opacity: 0; + -ms-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -ms-transform: translateX(-30px); + } + + 80% { + -ms-transform: translateX(10px); + } + + 100% { + -ms-transform: translateX(0); + } +} + +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + + 80% { + -o-transform: translateX(10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 60% { + opacity: 1; + transform: translateX(-30px); + } + + 80% { + transform: translateX(10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -ms-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + } +} + +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + + 25% { + -moz-transform: scale(.95); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + + 100% { + opacity: 0; + -moz-transform: scale(.3); + } +} + +@-ms-keyframes bounceOut { + 0% { + -ms-transform: scale(1); + } + + 25% { + -ms-transform: scale(.95); + } + + 50% { + opacity: 1; + -ms-transform: scale(1.1); + } + + 100% { + opacity: 0; + -ms-transform: scale(.3); + } +} + +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + + 25% { + -o-transform: scale(.95); + } + + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + + 100% { + opacity: 0; + -o-transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + transform: scale(1); + } + + 25% { + transform: scale(.95); + } + + 50% { + opacity: 1; + transform: scale(1.1); + } + + 100% { + opacity: 0; + transform: scale(.3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -ms-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-ms-keyframes bounceOutUp { + 0% { + -ms-transform: translateY(0); + } + + 20% { + opacity: 1; + -ms-transform: translateY(20px); + } + + 100% { + opacity: 0; + -ms-transform: translateY(-2000px); + } +} + +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(20px); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -ms-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-ms-keyframes bounceOutDown { + 0% { + -ms-transform: translateY(0); + } + + 20% { + opacity: 1; + -ms-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -ms-transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(-20px); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -ms-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-ms-keyframes bounceOutLeft { + 0% { + -ms-transform: translateX(0); + } + + 20% { + opacity: 1; + -ms-transform: translateX(20px); + } + + 100% { + opacity: 0; + -ms-transform: translateX(-2000px); + } +} + +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(20px); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -ms-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-ms-keyframes bounceOutRight { + 0% { + -ms-transform: translateX(0); + } + + 20% { + opacity: 1; + -ms-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -ms-transform: translateX(2000px); + } +} + +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(-20px); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -ms-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-ms-keyframes rotateIn { + 0% { + -ms-transform-origin: center center; + -ms-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -ms-transform-origin: center center; + -ms-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -ms-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-ms-keyframes rotateInUpLeft { + 0% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -ms-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-ms-keyframes rotateInDownLeft { + 0% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -ms-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-ms-keyframes rotateInUpRight { + 0% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -ms-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-ms-keyframes rotateInDownRight { + 0% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -ms-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} + +@-ms-keyframes rotateOut { + 0% { + -ms-transform-origin: center center; + -ms-transform: rotate(0); + opacity: 1; + } + + 100% { + -ms-transform-origin: center center; + -ms-transform: rotate(200deg); + opacity: 0; + } +} + +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -ms-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-ms-keyframes rotateOutUpLeft { + 0% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(0); + opacity: 1; + } + + 100% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + -transform-origin: left bottom; + -transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -ms-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-ms-keyframes rotateOutDownLeft { + 0% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(0); + opacity: 1; + } + + 100% { + -ms-transform-origin: left bottom; + -ms-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -ms-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-ms-keyframes rotateOutUpRight { + 0% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(0); + opacity: 1; + } + + 100% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -ms-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-ms-keyframes rotateOutDownRight { + 0% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(0); + opacity: 1; + } + + 100% { + -ms-transform-origin: right bottom; + -ms-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -ms-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes hinge { + 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 100% { -webkit-transform: translateY(700px); opacity: 0; } +} + +@-moz-keyframes hinge { + 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 100% { -moz-transform: translateY(700px); opacity: 0; } +} + +@-ms-keyframes hinge { + 0% { -ms-transform: rotate(0); -ms-transform-origin: top left; -ms-animation-timing-function: ease-in-out; } + 20%, 60% { -ms-transform: rotate(80deg); -ms-transform-origin: top left; -ms-animation-timing-function: ease-in-out; } + 40% { -ms-transform: rotate(60deg); -ms-transform-origin: top left; -ms-animation-timing-function: ease-in-out; } + 80% { -ms-transform: rotate(60deg) translateY(0); opacity: 1; -ms-transform-origin: top left; -ms-animation-timing-function: ease-in-out; } + 100% { -ms-transform: translateY(700px); opacity: 0; } +} + +@-o-keyframes hinge { + 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 100% { -o-transform: translateY(700px); opacity: 0; } +} + +@keyframes hinge { + 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } + 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } + 100% { transform: translateY(700px); opacity: 0; } +} + +.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -ms-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } +} + +@-moz-keyframes rollIn { + 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } +} + +@-ms-keyframes rollIn { + 0% { opacity: 0; -ms-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -ms-transform: translateX(0px) rotate(0deg); } +} + +@-o-keyframes rollIn { + 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } +} + +@keyframes rollIn { + 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } +} + +.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -ms-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} + +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} + +@-ms-keyframes rollOut { + 0% { + opacity: 1; + -ms-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -ms-transform: translateX(100%) rotate(120deg); + } +} + +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -ms-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} diff --git a/vendor/assets/javascripts/anythingslider/anythingslider.css b/vendor/assets/javascripts/anythingslider/anythingslider.css new file mode 100644 index 0000000..32e4921 --- /dev/null +++ b/vendor/assets/javascripts/anythingslider/anythingslider.css @@ -0,0 +1,291 @@ +/* + AnythingSlider v1.8+ Default theme + By Chris Coyier: http://css-tricks.com + with major improvements by Doug Neiner: http://pixelgraphics.us/ + based on work by Remy Sharp: http://jqueryfordesigners.com/ +*/ + +/***************************** + SET DEFAULT DIMENSIONS HERE + *****************************/ +/* change the ID & dimensions to match your slider */ +#slider { + width: 700px; + height: 390px; + list-style: none; + /* Prevent FOUC (see FAQ page) and keep things readable if javascript is disabled */ + overflow-y: auto; + overflow-x: hidden; +} + +/****************** + SET STYLING HERE + ****************** + ================================= + Default state (no keyboard focus) + ==================================*/ +/* Overall Wrapper */ +.anythingSlider-default { + margin: 0 auto; + /* 45px right & left padding for the arrows, 28px @ bottom for navigation */ + padding: 0 45px 28px 45px; +} +/* slider window - top & bottom borders, default state */ +.anythingSlider-default .anythingWindow { + border-top: 3px solid #777; + border-bottom: 3px solid #777; +} +/* Navigation buttons + start/stop button, default state */ +.anythingSlider-default .anythingControls a { + /* top shadow */ + background: #777 url(../images/default.png) center -288px repeat-x; + color: #000; + border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; +} +/* Make sure navigation text is visible */ +.anythingSlider-default .anythingControls a span { + visibility: visible; +} +/* Navigation current button, default state */ +.anythingSlider-default .anythingControls a.cur { + background: #888; + color: #000; +} + +/* start-stop button, stopped, default state */ +.anythingSlider-default .anythingControls a.start-stop { + background-color: #040; + color: #ddd; +} +/* start-stop button, playing, default state */ +.anythingSlider-default .anythingControls a.start-stop.playing { + background-color: #800; +} + +/* start-stop button, default hovered text color (when visible) */ +/* hide nav/start-stop background image shadow on hover - makes the button appear to come forward */ +.anythingSlider-default .anythingControls a.start-stop:hover, +.anythingSlider-default .anythingControls a.start-stop.hover, +.anythingSlider-default .anythingControls a.start-stop .anythingControls ul a:hover { + background-image: none; + color: #ddd; +} + +/* + ================================= + Active State (has keyboard focus) + ================================= +*/ +/* slider window - top & bottom borders, active state */ +.anythingSlider-default.activeSlider .anythingWindow { + border-color: #7C9127; +} +/* Navigation buttons, active state */ +.anythingSlider-default.activeSlider .anythingControls a { + /* background image = top shadow */ + background-color: #7C9127; +} +/* Navigation current & hovered button, active state */ +.anythingSlider-default.activeSlider .anythingControls a.cur, +.anythingSlider-default.activeSlider .anythingControls a:hover { + /* background image removed */ + background: #7C9127; +} + +/* start-stop button, stopped, active state */ +.anythingSlider-default.activeSlider .anythingControls a.start-stop { + background-color: #080; + color: #fff; +} +/* start-stop button, playing, active state */ +.anythingSlider-default.activeSlider .anythingControls a.start-stop.playing { + background-color: #d00; + color: #fff; +} +/* start-stop button, active slider hovered text color (when visible) */ +.anythingSlider-default.activeSlider .start-stop:hover, +.anythingSlider-default.activeSlider .start-stop.hover { + color: #fff; +} + +/************************ + NAVIGATION POSITIONING + ************************/ +/* Navigation Arrows */ +.anythingSlider-default .arrow { + top: 50%; + position: absolute; + display: block; +} + +.anythingSlider-default .arrow a { + display: block; + width: 45px; + height: 140px; + margin: -70px 0 0 0; /* half height of image */ + text-align: center; + outline: 0; + background: url(../images/default.png) no-repeat; +} + +/* back arrow */ +.anythingSlider-default .back { left: 0; } +.anythingSlider-default .back a { background-position: left top; } +.anythingSlider-default .back a:hover, +.anythingSlider-default .back a.hover { background-position: left -140px; } +/* forward arrow */ +.anythingSlider-default .forward { right: 0; } +.anythingSlider-default .forward a { background-position: right top; } +.anythingSlider-default .forward a:hover, +.anythingSlider-default .forward a.hover { background-position: right -140px; } + +/* Navigation Links */ +.anythingSlider-default .anythingControls { outline: 0; display: none; } +.anythingSlider-default .anythingControls ul { margin: 0; padding: 0; float: left; } +.anythingSlider-default .anythingControls ul li { display: inline; } +.anythingSlider-default .anythingControls ul a { + font: 11px/18px Georgia, Serif; + display: inline-block; + text-decoration: none; + padding: 2px 8px; + height: 18px; + margin: 0 5px 0 0; + text-align: center; + outline: 0; +} + +/* navigationSize window */ +.anythingSlider-default .anythingControls .anythingNavWindow { + overflow: hidden; + float: left; +} + +/* Autoplay Start/Stop button */ +.anythingSlider-default .anythingControls .start-stop { + padding: 2px 5px; + width: 40px; + text-align: center; + text-decoration: none; + float: right; + z-index: 100; + outline: 0; +} + +/*********************** + IE8 AND OLDER STYLING + ***********************/ + +/* Navigation Arrows */ +.as-oldie .anythingSlider-default .arrow { + top: 30%; +} +.as-oldie .anythingSlider-default .arrow a { + margin: 0; +} + +/* margin between nav buttons just looks better */ +.as-oldie .anythingSlider-default .anythingControls li { + margin-left: 3px; +} + +/* When using the navigationSize option, the side margins need to be zero + None of the navigation panels look good in IE7 now =( */ +.as-oldie .anythingSlider-default .anythingControls a { + margin: 0; +} +.as-oldie .anythingSlider-default .anythingNavWindow { + margin: 0 2px; +} +.as-oldie .anythingSlider-default .anythingNavWindow li { + padding: 3px 0 0 0; +} + +/*********************** + COMMON SLIDER STYLING + ***********************/ +/* Overall Wrapper */ +.anythingSlider { + display: block; + overflow: visible !important; + position: relative; +} +/* anythingSlider viewport window */ +.anythingSlider .anythingWindow { + overflow: hidden; + position: relative; + width: 100%; + height: 100%; +} +/* anythingSlider base (original element) */ +.anythingSlider .anythingBase { + background: transparent; + list-style: none; + position: absolute; + overflow: visible !important; + top: 0; + left: 0; + margin: 0; + padding: 0; +} + +/* Navigation arrow text; indent moved to span inside "a", for IE7; + apparently, a negative text-indent on an "a" link moves the link as well as the text */ +.anythingSlider .arrow span { + display: block; + visibility: hidden; +} +/* disabled arrows, hide or reduce opacity: opacity: .5; filter: alpha(opacity=50); */ +.anythingSlider .arrow.disabled { + display: none; +} +/* all panels inside the slider; horizontal mode */ +.anythingSlider .panel { + background: transparent; + display: block; + overflow: hidden; + float: left; + padding: 0; + margin: 0; +} +/* vertical mode */ +.anythingSlider .vertical .panel { + float: none; +} +/* fade mode */ +.anythingSlider .fade .panel { + float: none; + position: absolute; + top: 0; + left: 0; + z-index: -1; +} +/* fade mode active page - visible & on top */ +.anythingSlider .fade .activePage { + z-index: 0; +} + +/*********************** + RTL STYLING + ***********************/ +/* slider autoplay right-to-left, reverse order of nav links to look better */ +.anythingSlider.rtl .anythingWindow { + direction: ltr; + unicode-bidi: bidi-override; +} +.anythingSlider.rtl .anythingControls ul { float: left; } /* move nav link group to left */ +.anythingSlider.rtl .anythingControls ul a { float: right; } /* reverse order of nav links */ +.anythingSlider.rtl .start-stop { /* float: right; */ } /* move start/stop button - in case you want to switch sides */ + +/* probably not necessary, but added just in case */ +.anythingSlider, +.anythingSlider .anythingWindow, +.anythingSlider .anythingControls ul a, +.anythingSlider .arrow a, +.anythingSlider .start-stop { + transition-duration: 0; + -o-transition-duration: 0; + -moz-transition-duration: 0; + -webkit-transition-duration: 0; +} diff --git a/vendor/assets/javascripts/anythingslider/images/arrows-metallic.png b/vendor/assets/javascripts/anythingslider/images/arrows-metallic.png new file mode 100644 index 0000000..c3a8f4a Binary files /dev/null and b/vendor/assets/javascripts/anythingslider/images/arrows-metallic.png differ diff --git a/vendor/assets/javascripts/anythingslider/images/arrows-minimalist.png b/vendor/assets/javascripts/anythingslider/images/arrows-minimalist.png new file mode 100644 index 0000000..64b64ad Binary files /dev/null and b/vendor/assets/javascripts/anythingslider/images/arrows-minimalist.png differ diff --git a/vendor/assets/javascripts/anythingslider/images/construction.gif b/vendor/assets/javascripts/anythingslider/images/construction.gif new file mode 100644 index 0000000..6111d84 Binary files /dev/null and b/vendor/assets/javascripts/anythingslider/images/construction.gif differ diff --git a/vendor/assets/javascripts/anythingslider/images/cs-portfolio.png b/vendor/assets/javascripts/anythingslider/images/cs-portfolio.png new file mode 100644 index 0000000..c9a9e0e Binary files /dev/null and b/vendor/assets/javascripts/anythingslider/images/cs-portfolio.png differ diff --git a/vendor/assets/javascripts/anythingslider/images/default.png b/vendor/assets/javascripts/anythingslider/images/default.png new file mode 100644 index 0000000..9fc837c Binary files /dev/null and b/vendor/assets/javascripts/anythingslider/images/default.png differ diff --git a/vendor/assets/javascripts/anythingslider/jquery.anythingslider.fx.min.js b/vendor/assets/javascripts/anythingslider/jquery.anythingslider.fx.min.js new file mode 100644 index 0000000..e8af997 --- /dev/null +++ b/vendor/assets/javascripts/anythingslider/jquery.anythingslider.fx.min.js @@ -0,0 +1,6 @@ +/* + * AnythingSlider Slide FX 1.6 minified for AnythingSlider v1.7.11+ + * By Rob Garrison (aka Mottie & Fudgey) + * Dual licensed under the MIT and GPL licenses. + */ +(function(h){h.fn.anythingSliderFx=function(q,r){var n=h(this).closest(".anythingSlider"),i=n.width(),o=n.height(),p=function(a){var b=a,l;a&&"string"===typeof a&&0
');a.$el.data("AnythingSlider",a);a.init=function(){a.options=b=d.extend({},d.anythingSlider.defaults,k);a.initialized=!1;d.isFunction(b.onBeforeInitialize)&&a.$el.bind("before_initialize",b.onBeforeInitialize);a.$el.trigger("before_initialize",a);d('<\!--[if lte IE 8]>