Nicolae Claudius
11 years ago
27 changed files with 402 additions and 82 deletions
@ -0,0 +1,6 @@ |
|||||||
|
class Users::AuthenticationsController < UsersController |
||||||
|
active_scaffold :authentication do |conf| |
||||||
|
conf.list.columns = [:provider] |
||||||
|
conf.actions.exclude :create, :search, :update, :show |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,78 @@ |
|||||||
|
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController |
||||||
|
|
||||||
|
def google_apps |
||||||
|
oauthorize 'google_apps' |
||||||
|
end |
||||||
|
|
||||||
|
protected |
||||||
|
|
||||||
|
def oauthorize(provider) |
||||||
|
@user = find_for_oauth(provider) |
||||||
|
return unless @user |
||||||
|
if @user.active_for_authentication? |
||||||
|
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", kind: provider.camelcase |
||||||
|
session["devise.google_apps_data"] = env["omniauth.auth"] |
||||||
|
@user.remember_me! if session.delete(:user_remember_me) == "1" |
||||||
|
end |
||||||
|
if user_signed_in? |
||||||
|
redirect_to :back |
||||||
|
else |
||||||
|
sign_in_and_redirect @user, event: :authentication |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def find_for_oauth(provider) |
||||||
|
user = if resource then resource |
||||||
|
elsif email then find_or_create_by_email(email) |
||||||
|
elsif uid then find_or_create_by_uid(uid) |
||||||
|
else raise "Bad provider data: #{auth.inspect}" |
||||||
|
end |
||||||
|
|
||||||
|
authentication = user.authentications.where(provider: provider).first |
||||||
|
if authentication.nil? |
||||||
|
authentication_attrs = authorization_attrs.merge(provider: provider) |
||||||
|
authentication = user.authentications.build(authentication_attrs) |
||||||
|
user.authentications << authentication |
||||||
|
end |
||||||
|
|
||||||
|
return user |
||||||
|
end |
||||||
|
|
||||||
|
def find_or_create_by_uid(uid) |
||||||
|
auth = Authentication.where(uid: uid).first |
||||||
|
return auth ? auth.user : make_user |
||||||
|
end |
||||||
|
|
||||||
|
def find_or_create_by_email(email) |
||||||
|
user = User.where(email: email).first |
||||||
|
return user ? user : make_user |
||||||
|
end |
||||||
|
|
||||||
|
def make_user |
||||||
|
return current_user if user_signed_in? |
||||||
|
user = User.new(user_attrs.merge(password: Devise.friendly_token[0,20])) |
||||||
|
user.skip_confirmation! |
||||||
|
user.save!(validate: false) |
||||||
|
return user |
||||||
|
end |
||||||
|
|
||||||
|
def auth; env["omniauth.auth"] end |
||||||
|
def uid; @uid ||= auth['uid'] rescue nil end |
||||||
|
def email; @email ||= auth['info']['email'] rescue nil end |
||||||
|
|
||||||
|
def authorization_attrs |
||||||
|
@authorization_attrs ||= { |
||||||
|
uid: uid, |
||||||
|
token: auth['credentials']['token'], |
||||||
|
secret: auth['credentials']['secret'], |
||||||
|
name: auth['info']['name'] |
||||||
|
} |
||||||
|
end |
||||||
|
|
||||||
|
def user_attrs |
||||||
|
@user_attrs ||= { email: email, full_name: auth['info']['name'] } |
||||||
|
end |
||||||
|
|
||||||
|
def handle_unverified_request; true end |
||||||
|
|
||||||
|
end |
@ -0,0 +1,15 @@ |
|||||||
|
module Users::AuthenticationsHelper |
||||||
|
def authentication_provider_column(record, column) |
||||||
|
case record.provider |
||||||
|
when 'google_apps' |
||||||
|
ret = <<-DOC |
||||||
|
<span class="btn btn-block btn-social btn-google-plus"> |
||||||
|
<i class="fa fa-google-plus"></i> Google |
||||||
|
</span> |
||||||
|
DOC |
||||||
|
ret.html_safe |
||||||
|
else |
||||||
|
record.provider.camelcase |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,3 @@ |
|||||||
|
class Authentication < ActiveRecord::Base |
||||||
|
belongs_to :user, :inverse_of => :authentications |
||||||
|
end |
@ -1,14 +1,20 @@ |
|||||||
<%= render :partial => "users/shared/links" %> |
<%= render :partial => "users/shared/links" %> |
||||||
|
|
||||||
<%= simple_form_for(resource, |
<div class="row"> |
||||||
as: resource_name, |
<div class="col-lg-offset-4 col-lg-4 well"> |
||||||
url: confirmation_path(resource_name), |
|
||||||
method: :post |
|
||||||
) do |f| %> |
|
||||||
|
|
||||||
<%= devise_error_messages! %> |
<%= simple_form_for(resource, |
||||||
|
as: resource_name, |
||||||
|
url: confirmation_path(resource_name), |
||||||
|
method: :post |
||||||
|
) do |f| %> |
||||||
|
|
||||||
<%= f.input :email, required: true %> |
<%= devise_error_messages! %> |
||||||
|
|
||||||
<%= f.submit "Resend confirmation instructions", class: 'btn btn-primary' %> |
<%= f.input :email, required: true %> |
||||||
<% end %> |
|
||||||
|
<%= f.submit "Resend confirmation instructions", class: 'btn btn-primary' %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
@ -1,14 +1,20 @@ |
|||||||
<%= render :partial => "users/shared/links" %> |
<%= render :partial => "users/shared/links" %> |
||||||
|
|
||||||
<%= simple_form_for(resource, |
<div class="row"> |
||||||
as: resource_name, |
<div class="col-lg-offset-4 col-lg-4 well"> |
||||||
url: password_path(resource_name), |
|
||||||
method: :post |
|
||||||
) do |f| %> |
|
||||||
|
|
||||||
<%= devise_error_messages! %> |
<%= simple_form_for(resource, |
||||||
|
as: resource_name, |
||||||
|
url: password_path(resource_name), |
||||||
|
method: :post |
||||||
|
) do |f| %> |
||||||
|
|
||||||
<%= f.input :email, required: true %> |
<%= devise_error_messages! %> |
||||||
|
|
||||||
<%= f.submit "Send me reset password instructions", class: 'btn btn-primary' %> |
<%= f.input :email, required: true %> |
||||||
<% end %> |
|
||||||
|
<%= f.submit "Send me reset password instructions", class: 'btn btn-primary' %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
@ -1,4 +1,9 @@ |
|||||||
<%= render :partial => "users/shared/links" %> |
<%= render 'users/shared/links' %> |
||||||
|
|
||||||
<%= render 'users/registrations/new' %> |
<div class="row"> |
||||||
|
<div class="col-lg-offset-4 col-lg-4 well"> |
||||||
|
|
||||||
|
<%= render 'users/registrations/new' %> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
@ -1,19 +1,36 @@ |
|||||||
<%= render :partial => "users/shared/links" %> |
<%= render 'users/shared/links' %> |
||||||
|
|
||||||
<%= simple_form_for(resource, |
<div class="row"> |
||||||
as: resource_name, |
<div class="col-lg-offset-4 col-lg-4 well"> |
||||||
url: session_path(resource_name) |
|
||||||
) do |f| %> |
<p> |
||||||
|
<%= link_to user_omniauth_authorize_path(:google_apps), |
||||||
<%= f.input :email, required: true %> |
class: 'btn btn-block btn-social btn-google-plus', |
||||||
<%= f.input :password, required: true %> |
'data-no-turbolink' => true do %> |
||||||
<% if devise_mapping.rememberable? -%> |
<i class="fa fa-google-plus"></i> Sign in with Google |
||||||
<%= f.input :remember_me, as: :boolean %> |
<% end %> |
||||||
<% end -%> |
</p> |
||||||
|
|
||||||
<%= f.submit "Sign in", class: 'btn btn-primary' %> |
<h5 class="text-info text-center text-separator">Or use the form below</h5> |
||||||
<small> |
|
||||||
or <%= link_to "Sign up", new_registration_path(resource_name) %> |
<%= simple_form_for(resource, |
||||||
/ <%= link_to 'Forgot your password?', new_password_path(resource_name) %> |
as: resource_name, |
||||||
</small> |
url: session_path(resource_name) |
||||||
<% end %> |
) do |f| %> |
||||||
|
|
||||||
|
<%= f.input :email, required: true %> |
||||||
|
<%= f.input :password, required: true %> |
||||||
|
<% if devise_mapping.rememberable? -%> |
||||||
|
<%= f.input :remember_me, as: :boolean %> |
||||||
|
<% end -%> |
||||||
|
|
||||||
|
<%= f.submit "Sign in", class: 'btn btn-primary' %> |
||||||
|
<small> |
||||||
|
or <%= link_to "Sign up", new_registration_path(resource_name) %> |
||||||
|
/ <%= link_to 'Forgot password', new_password_path(resource_name) %> |
||||||
|
</small> |
||||||
|
|
||||||
|
<% end %> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
@ -1,10 +1,10 @@ |
|||||||
<br /> |
<br /> |
||||||
<% semantic_navigation :devise_nav, html: { class: 'nav nav-tabs' } do |n| %> |
<% semantic_navigation :devise_nav, html: { class: 'nav nav-tabs nav-justified' } do |n| %> |
||||||
<%= n.item "Sign in", link: new_session_path(resource_name) %> |
<%= n.item "Sign in", link: new_session_path(resource_name) %> |
||||||
<%= n.item "Sign up", link: new_registration_path(resource_name) %> |
<%= n.item "Sign up", link: new_registration_path(resource_name) %> |
||||||
<%= n.item "Forgot your password?", link: new_password_path(resource_name), |
<%= n.item "Forgot password", link: new_password_path(resource_name), |
||||||
highlights_on: [{ controller: 'devise/passwords' }] %> |
highlights_on: [{ controller: 'devise/passwords' }] %> |
||||||
<%= n.item "Didn't receive confirmation instructions?", link: new_confirmation_path(resource_name) %> |
<%= n.item "Resend confirmation instructions", link: new_confirmation_path(resource_name) %> |
||||||
<%= n.item "Didn't receive unlock instructions?", link: new_unlock_path(resource_name) %> |
<%= n.item "Resend unlock instructions", link: new_unlock_path(resource_name) %> |
||||||
<% end %> |
<% end %> |
||||||
</br> |
</br> |
||||||
|
@ -1,14 +1,20 @@ |
|||||||
<%= render :partial => "users/shared/links" %> |
<%= render :partial => "users/shared/links" %> |
||||||
|
|
||||||
<%= simple_form_for(resource, |
<div class="row"> |
||||||
as: resource_name, |
<div class="col-lg-offset-4 col-lg-4 well"> |
||||||
url: unlock_path(resource_name), |
|
||||||
method: :post |
|
||||||
) do |f| %> |
|
||||||
|
|
||||||
<%= devise_error_messages! %> |
<%= simple_form_for(resource, |
||||||
|
as: resource_name, |
||||||
|
url: unlock_path(resource_name), |
||||||
|
method: :post |
||||||
|
) do |f| %> |
||||||
|
|
||||||
<%= f.input :email, required: true %> |
<%= devise_error_messages! %> |
||||||
|
|
||||||
<%= f.submit "Resend unlock instructions", class: 'btn btn-primary' %> |
<%= f.input :email, required: true %> |
||||||
<% end %> |
|
||||||
|
<%= f.submit "Resend unlock instructions", class: 'btn btn-primary' %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,14 @@ |
|||||||
|
class CreateAuthentications < ActiveRecord::Migration |
||||||
|
def change |
||||||
|
create_table :authentications do |t| |
||||||
|
t.references :user, index: true |
||||||
|
t.string :provider, null: false |
||||||
|
t.string :uid, null: false |
||||||
|
t.string :token |
||||||
|
t.string :secret |
||||||
|
t.string :name |
||||||
|
|
||||||
|
t.timestamps |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,15 @@ |
|||||||
|
require "spec_helper" |
||||||
|
|
||||||
|
describe Users::AuthenticationsController do |
||||||
|
describe "routing" do |
||||||
|
|
||||||
|
it "routes to #index" do |
||||||
|
get("/authentications").should route_to("users/authentications#index") |
||||||
|
end |
||||||
|
|
||||||
|
it "routes to #destroy" do |
||||||
|
delete("/authentications/1").should route_to("users/authentications#destroy", :id => "1") |
||||||
|
end |
||||||
|
|
||||||
|
end |
||||||
|
end |
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Social Buttons for Bootstrap |
||||||
|
* |
||||||
|
* Copyright 2013 Panayiotis Lipiridis |
||||||
|
* Licensed under the MIT License |
||||||
|
* |
||||||
|
* https://github.com/lipis/bootstrap-social |
||||||
|
*/ |
||||||
|
|
||||||
|
.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social :first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)} |
||||||
|
.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em} |
||||||
|
.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em} |
||||||
|
.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em} |
||||||
|
.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon :first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)} |
||||||
|
.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em} |
||||||
|
.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em} |
||||||
|
.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em} |
||||||
|
.btn-social-icon :first-child{border:none;text-align:center;width:100% !important} |
||||||
|
.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0} |
||||||
|
.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0} |
||||||
|
.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0} |
||||||
|
.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket:active,.btn-bitbucket.active,.open .dropdown-toggle.btn-bitbucket{color:#fff;background-color:#183c60;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-bitbucket:active,.btn-bitbucket.active,.open .dropdown-toggle.btn-bitbucket{background-image:none} |
||||||
|
.btn-bitbucket.disabled,.btn-bitbucket[disabled],fieldset[disabled] .btn-bitbucket,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled:active,.btn-bitbucket[disabled]:active,fieldset[disabled] .btn-bitbucket:active,.btn-bitbucket.disabled.active,.btn-bitbucket[disabled].active,fieldset[disabled] .btn-bitbucket.active{background-color:#205081;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox:active,.btn-dropbox.active,.open .dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d70b7;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-dropbox:active,.btn-dropbox.active,.open .dropdown-toggle.btn-dropbox{background-image:none} |
||||||
|
.btn-dropbox.disabled,.btn-dropbox[disabled],fieldset[disabled] .btn-dropbox,.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled:active,.btn-dropbox[disabled]:active,fieldset[disabled] .btn-dropbox:active,.btn-dropbox.disabled.active,.btn-dropbox[disabled].active,fieldset[disabled] .btn-dropbox.active{background-color:#1087dd;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook:active,.btn-facebook.active,.open .dropdown-toggle.btn-facebook{color:#fff;background-color:#30487b;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-facebook:active,.btn-facebook.active,.open .dropdown-toggle.btn-facebook{background-image:none} |
||||||
|
.btn-facebook.disabled,.btn-facebook[disabled],fieldset[disabled] .btn-facebook,.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled:active,.btn-facebook[disabled]:active,fieldset[disabled] .btn-facebook:active,.btn-facebook.disabled.active,.btn-facebook[disabled].active,fieldset[disabled] .btn-facebook.active{background-color:#3b5998;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr:active,.btn-flickr.active,.open .dropdown-toggle.btn-flickr{color:#fff;background-color:#d6006f;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-flickr:active,.btn-flickr.active,.open .dropdown-toggle.btn-flickr{background-image:none} |
||||||
|
.btn-flickr.disabled,.btn-flickr[disabled],fieldset[disabled] .btn-flickr,.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled:active,.btn-flickr[disabled]:active,fieldset[disabled] .btn-flickr:active,.btn-flickr.disabled.active,.btn-flickr[disabled].active,fieldset[disabled] .btn-flickr.active{background-color:#ff0084;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github:active,.btn-github.active,.open .dropdown-toggle.btn-github{color:#fff;background-color:#303030;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-github:active,.btn-github.active,.open .dropdown-toggle.btn-github{background-image:none} |
||||||
|
.btn-github.disabled,.btn-github[disabled],fieldset[disabled] .btn-github,.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled:active,.btn-github[disabled]:active,fieldset[disabled] .btn-github:active,.btn-github.disabled.active,.btn-github[disabled].active,fieldset[disabled] .btn-github.active{background-color:#444;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-google-plus{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover,.btn-google-plus:focus,.btn-google-plus:active,.btn-google-plus.active,.open .dropdown-toggle.btn-google-plus{color:#fff;background-color:#ca3523;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-google-plus:active,.btn-google-plus.active,.open .dropdown-toggle.btn-google-plus{background-image:none} |
||||||
|
.btn-google-plus.disabled,.btn-google-plus[disabled],fieldset[disabled] .btn-google-plus,.btn-google-plus.disabled:hover,.btn-google-plus[disabled]:hover,fieldset[disabled] .btn-google-plus:hover,.btn-google-plus.disabled:focus,.btn-google-plus[disabled]:focus,fieldset[disabled] .btn-google-plus:focus,.btn-google-plus.disabled:active,.btn-google-plus[disabled]:active,fieldset[disabled] .btn-google-plus:active,.btn-google-plus.disabled.active,.btn-google-plus[disabled].active,fieldset[disabled] .btn-google-plus.active{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram:active,.btn-instagram.active,.open .dropdown-toggle.btn-instagram{color:#fff;background-color:#335d7e;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-instagram:active,.btn-instagram.active,.open .dropdown-toggle.btn-instagram{background-image:none} |
||||||
|
.btn-instagram.disabled,.btn-instagram[disabled],fieldset[disabled] .btn-instagram,.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled:active,.btn-instagram[disabled]:active,fieldset[disabled] .btn-instagram:active,.btn-instagram.disabled.active,.btn-instagram[disabled].active,fieldset[disabled] .btn-instagram.active{background-color:#3f729b;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin:active,.btn-linkedin.active,.open .dropdown-toggle.btn-linkedin{color:#fff;background-color:#005f8d;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-linkedin:active,.btn-linkedin.active,.open .dropdown-toggle.btn-linkedin{background-image:none} |
||||||
|
.btn-linkedin.disabled,.btn-linkedin[disabled],fieldset[disabled] .btn-linkedin,.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled:active,.btn-linkedin[disabled]:active,fieldset[disabled] .btn-linkedin:active,.btn-linkedin.disabled.active,.btn-linkedin[disabled].active,fieldset[disabled] .btn-linkedin.active{background-color:#007bb6;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest:active,.btn-pinterest.active,.open .dropdown-toggle.btn-pinterest{color:#fff;background-color:#a81a20;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-pinterest:active,.btn-pinterest.active,.open .dropdown-toggle.btn-pinterest{background-image:none} |
||||||
|
.btn-pinterest.disabled,.btn-pinterest[disabled],fieldset[disabled] .btn-pinterest,.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled:active,.btn-pinterest[disabled]:active,fieldset[disabled] .btn-pinterest:active,.btn-pinterest.disabled.active,.btn-pinterest[disabled].active,fieldset[disabled] .btn-pinterest.active{background-color:#cb2027;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr:active,.btn-tumblr.active,.open .dropdown-toggle.btn-tumblr{color:#fff;background-color:#1f3346;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-tumblr:active,.btn-tumblr.active,.open .dropdown-toggle.btn-tumblr{background-image:none} |
||||||
|
.btn-tumblr.disabled,.btn-tumblr[disabled],fieldset[disabled] .btn-tumblr,.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled:active,.btn-tumblr[disabled]:active,fieldset[disabled] .btn-tumblr:active,.btn-tumblr.disabled.active,.btn-tumblr[disabled].active,fieldset[disabled] .btn-tumblr.active{background-color:#2c4762;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter:active,.btn-twitter.active,.open .dropdown-toggle.btn-twitter{color:#fff;background-color:#309aea;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-twitter:active,.btn-twitter.active,.open .dropdown-toggle.btn-twitter{background-image:none} |
||||||
|
.btn-twitter.disabled,.btn-twitter[disabled],fieldset[disabled] .btn-twitter,.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled:active,.btn-twitter[disabled]:active,fieldset[disabled] .btn-twitter:active,.btn-twitter.disabled.active,.btn-twitter[disabled].active,fieldset[disabled] .btn-twitter.active{background-color:#55acee;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk:active,.btn-vk.active,.open .dropdown-toggle.btn-vk{color:#fff;background-color:#4a6a89;border-color:rgba(0,0,0,0.2)} |
||||||
|
.btn-vk:active,.btn-vk.active,.open .dropdown-toggle.btn-vk{background-image:none} |
||||||
|
.btn-vk.disabled,.btn-vk[disabled],fieldset[disabled] .btn-vk,.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled:active,.btn-vk[disabled]:active,fieldset[disabled] .btn-vk:active,.btn-vk.disabled.active,.btn-vk[disabled].active,fieldset[disabled] .btn-vk.active{background-color:#587ea3;border-color:rgba(0,0,0,0.2)} |
Loading…
Reference in new issue