diff --git a/bower.json b/bower.json index 67d81ba..3f825f0 100644 --- a/bower.json +++ b/bower.json @@ -56,7 +56,8 @@ "ng-js-tree": "~0.0.7", "angular-ui-select": "^0.19.6", "angular-upload": "^1.0.12", - "ng-tags-input": "^3.2.0" + "ng-tags-input": "^3.2.0", + "lodash": "^4.17.4" }, "resolutions": { "angular": "~1.5.9", diff --git a/src/app/pages/.DS_Store b/src/app/pages/.DS_Store index f0fab09..38d4309 100644 Binary files a/src/app/pages/.DS_Store and b/src/app/pages/.DS_Store differ diff --git a/src/app/pages/authSignIn/auth.service.js b/src/app/pages/authSignIn/auth.service.js new file mode 100644 index 0000000..b4a9d65 --- /dev/null +++ b/src/app/pages/authSignIn/auth.service.js @@ -0,0 +1,39 @@ +/** + * @author ayoub + */ +(function () { + 'use strict'; + + angular.module('BlurAdmin.pages.authSignIn') + .factory('AuthService',AuthService); + + /** @ngInject */ + function AuthService($http, $q) { + var apiBaseUrl = "http://localhost:9000" + var endpoint = apiBaseUrl + "/auth"; + + function login(params) { + params = params || {}; + + var access_token = { "access_token" : params.access_token } + var auth = { headers : { 'Authorization': 'Basic ' + btoa(params.email + ":" + params.password)}} + + var deferred = $q.defer(); + $http.post(endpoint, access_token, auth) + .success(function(data) { + deferred.resolve(data); + }).error(function(msg, code) { + deferred.reject(msg); + }); + + return deferred.promise; + + + return $http.post(endpoint, access_token, auth) + } + + return { + login:login + } + } +})(); diff --git a/src/app/pages/authSignIn/authSignIn.html b/src/app/pages/authSignIn/authSignIn.html new file mode 100644 index 0000000..3993ebc --- /dev/null +++ b/src/app/pages/authSignIn/authSignIn.html @@ -0,0 +1,35 @@ +
+
+
+

Sign in to Blur Admin

+ New to Blur Admin? Sign up! + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+ + Forgot password? +
+
+
+ +
{{vm.error}} +
+ +
+
+
diff --git a/src/app/pages/authSignIn/authSignIn.module.js b/src/app/pages/authSignIn/authSignIn.module.js new file mode 100644 index 0000000..b783ea7 --- /dev/null +++ b/src/app/pages/authSignIn/authSignIn.module.js @@ -0,0 +1,22 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.authSignIn', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig($stateProvider) { + $stateProvider + .state('authSignIn', { + url: '/authSignIn', + templateUrl: 'app/pages/authSignIn/authSignIn.html', + title: 'My Page', + controller: 'authSignInCtrl', + sidebarMeta: { + order: 800, + }, + authenticate: false + }); + } + +})(); diff --git a/src/app/pages/authSignIn/authSignInCtrl.js b/src/app/pages/authSignIn/authSignInCtrl.js new file mode 100644 index 0000000..884eb96 --- /dev/null +++ b/src/app/pages/authSignIn/authSignInCtrl.js @@ -0,0 +1,49 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.authSignIn') + .controller('authSignInCtrl', authSignInCtrl); + + /** @ngInject */ + function authSignInCtrl($scope, localStorage, $state, AuthService) { + var vm = this; + + + vm.login = login; + + init(); + + function init() { + localStorage.clear(); + vm.error = "" + } + + function login() { + var userObject = { + email: vm.email, + password: vm.password + }; + AuthService + .login(userObject) + .then( + function (data){ + if (data.token && data.user) { + + localStorage.setObject('user', data.user); + localStorage.setObject('token', data.token); + $state.go('main.dashboard'); + } + console.log("AuthService loggedin",data) + }, + function (error){ + vm.error = "There were an error logging you in" + console.log("Error", error); + } + ); + + } + + + } + +})(); diff --git a/src/app/pages/authSignUp/authSignUp.html b/src/app/pages/authSignUp/authSignUp.html new file mode 100644 index 0000000..42cfdfc --- /dev/null +++ b/src/app/pages/authSignUp/authSignUp.html @@ -0,0 +1,49 @@ +
+ +
+
+

Sign up to Blur Admin

+ Already have a Blur Admin account? Sign in! + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+ +
+
+
+ +
or Sign up with one click +
+ + +
+
+
diff --git a/src/app/pages/authSignUp/authSignUp.module.js b/src/app/pages/authSignUp/authSignUp.module.js new file mode 100644 index 0000000..059221d --- /dev/null +++ b/src/app/pages/authSignUp/authSignUp.module.js @@ -0,0 +1,22 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.authSignUp', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig($stateProvider) { + $stateProvider + .state('authSignUp', { + url: '/authSignUp', + templateUrl: 'app/pages/authSignUp/authSignUp.html', + title: 'My Page', + controller: 'authSignUpCtrl', + sidebarMeta: { + order: 800, + }, + authenticate: false + }); + } + +})(); diff --git a/src/app/pages/authSignUp/authSignUpCtrl.js b/src/app/pages/authSignUp/authSignUpCtrl.js new file mode 100644 index 0000000..fcbd6b3 --- /dev/null +++ b/src/app/pages/authSignUp/authSignUpCtrl.js @@ -0,0 +1,13 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.authSignUp') + .controller('authSignUpCtrl', authSignUpCtrl); + + /** @ngInject */ + function authSignUpCtrl($scope) { + var vm = this; + + } + +})(); diff --git a/src/app/pages/config/config.module.js b/src/app/pages/config/config.module.js new file mode 100644 index 0000000..428e54a --- /dev/null +++ b/src/app/pages/config/config.module.js @@ -0,0 +1,13 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.config', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig() { + + } + + +})(); diff --git a/src/app/pages/config/routeChange.js b/src/app/pages/config/routeChange.js new file mode 100644 index 0000000..78d1acf --- /dev/null +++ b/src/app/pages/config/routeChange.js @@ -0,0 +1,20 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.config') + .run(stateChangeStart); + + /** @ngInject */ + function stateChangeStart($rootScope, $state, localStorage) { + $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) { + var login = localStorage.getObject('user'); + var token = localStorage.getObject('token'); + if (toState.authenticate && (_.isEmpty(login) || _.isEmpty(token)) ) { + // User isn’t authenticated + $state.transitionTo("authSignIn"); + event.preventDefault(); + } + }); + } + +})(); diff --git a/src/app/pages/dashboard/.DS_Store b/src/app/pages/dashboard/.DS_Store new file mode 100644 index 0000000..035cf63 Binary files /dev/null and b/src/app/pages/dashboard/.DS_Store differ diff --git a/src/app/pages/dashboard/dashboard.html b/src/app/pages/dashboard/dashboard.html new file mode 100644 index 0000000..4ff029a --- /dev/null +++ b/src/app/pages/dashboard/dashboard.html @@ -0,0 +1 @@ +Dash \ No newline at end of file diff --git a/src/app/pages/dashboard/dashboard.module.js b/src/app/pages/dashboard/dashboard.module.js new file mode 100644 index 0000000..775bcfe --- /dev/null +++ b/src/app/pages/dashboard/dashboard.module.js @@ -0,0 +1,26 @@ +/** + * @author v.lugovsky + * created on 16.12.2015 + */ +(function () { + 'use strict'; + + angular.module('BlurAdmin.pages.dashboard', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig($stateProvider) { + $stateProvider + .state('main.dashboard', { + url: '/dashboard', + templateUrl: 'app/pages/dashboard/dashboard.html', + title: 'Dashboard', + sidebarMeta: { + icon: 'ion-android-home', + order: 0, + }, + authenticate: true + }); + } + +})(); diff --git a/src/app/pages/main/main.html b/src/app/pages/main/main.html new file mode 100644 index 0000000..898142d --- /dev/null +++ b/src/app/pages/main/main.html @@ -0,0 +1,31 @@ +
+
+ + + + +
+
+ +
+
+
+ + + + +
+
+
+
diff --git a/src/app/pages/main/main.module.js b/src/app/pages/main/main.module.js new file mode 100644 index 0000000..c0f69cc --- /dev/null +++ b/src/app/pages/main/main.module.js @@ -0,0 +1,24 @@ +/** + * @author l.azevedo + * created on 29.07.2017 + */ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.main', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig($stateProvider) { + $stateProvider + .state('main', { + url: '/main', + templateUrl: 'app/pages/main/main.html', + redirectTo: 'main.dashboard', + authenticate: true + + + }); + } + +})(); diff --git a/src/app/pages/pages.module.js b/src/app/pages/pages.module.js index 3f7364f..f8064a1 100644 --- a/src/app/pages/pages.module.js +++ b/src/app/pages/pages.module.js @@ -8,15 +8,24 @@ angular.module('BlurAdmin.pages', [ 'ui.router', + 'BlurAdmin.pages.dashboard', + 'BlurAdmin.pages.main', 'BlurAdmin.pages.surveys', 'BlurAdmin.pages.teams', 'BlurAdmin.pages.viewer', - ]) - .config(routeConfig); + 'BlurAdmin.pages.authSignIn', + 'BlurAdmin.pages.authSignUp', + 'BlurAdmin.pages.services', + 'BlurAdmin.pages.config', + //'BlurAdmin.pages.main', + ]).config(routeConfig) + .factory('authInterceptor', authInterceptor); /** @ngInject */ - function routeConfig($urlRouterProvider, baSidebarServiceProvider) { - $urlRouterProvider.otherwise('/dashboard'); + function routeConfig($urlRouterProvider, baSidebarServiceProvider, $httpProvider) { + $urlRouterProvider.otherwise('/authSignIn'); + + $httpProvider.interceptors.push('authInterceptor'); baSidebarServiceProvider.addStaticItem({ title: 'Pages', @@ -40,4 +49,44 @@ }); } + + function authInterceptor($rootScope, $q, localStorage) { + console.log('authInterceptor') + return { + request: function (config) { + config.headers = config.headers || {}; + + if (config.data !== undefined && config.url.indexOf('auth') != -1) { + config.data.access_token = 'AlAoWLue33D1sBrKNHOohXdvYNh2Je9i'; //TODO : get this from the config + } + else if (localStorage.getObject('token')) { + + if (config.data === undefined) { + //Do nothing if data is not originally supplied from the calling method + } + else { + config.data.access_token = localStorage.getObject('token'); + console.log() + } + + if (config.method === 'GET') { + /*if (config.params === undefined) { + config.params = {}; + } + config.params.test = localStorage.getObject('token');*/ + } + //config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token; + } + return config; + }, + responseError: function (rejection) { + if (rejection.status === 401) { + console.log("not authorised"); + localStorage.clear(); + } + return $q.reject(rejection); + } + }; +}; + })(); diff --git a/src/app/pages/services/localStorage.js b/src/app/pages/services/localStorage.js new file mode 100644 index 0000000..9267f62 --- /dev/null +++ b/src/app/pages/services/localStorage.js @@ -0,0 +1,56 @@ +/** + * @author l.azevedo + * created on 29/06/2017 + */ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.services') + .service('localStorage', localStorage); + + /** @ngInject */ + function localStorage($window) { + var service = { + set: set, + get: get, + setObject: setObject, + getObject: getObject, + clear: clear + } + + return service; + + function set(key, value) { + if ($window.fakeLocalStorage) { + $window.fakeLocalStorage[key] = value; + } else { + $window.localStorage[key] = value; + } + } + + function get(key, defaultValue) { + return !$window.fakeLocalStorage ? $window.localStorage[key] || defaultValue : $window.fakeLocalStorage[key] || defaultValue; + } + + function setObject(key, value) { + if ($window.fakeLocalStorage) { + $window.fakeLocalStorage[key] = angular.toJson(value); + } else { + $window.localStorage[key] = angular.toJson(value); + } + } + + function getObject(key) { + return !$window.fakeLocalStorage ? angular.fromJson($window.localStorage[key] || '{}') : angular.fromJson($window.fakeLocalStorage[key] || '{}'); + } + + function clear() { + if ($window.fakeLocalStorage) { + $window.fakeLocalStorage = {}; + } else { + $window.localStorage.clear(); + } + } + } + +})(); diff --git a/src/app/pages/services/services.module.js b/src/app/pages/services/services.module.js new file mode 100644 index 0000000..94a296d --- /dev/null +++ b/src/app/pages/services/services.module.js @@ -0,0 +1,12 @@ +(function() { + 'use strict'; + + angular.module('BlurAdmin.pages.services', []) + .config(routeConfig); + + /** @ngInject */ + function routeConfig() { + + } + +})(); diff --git a/src/app/pages/surveys/create/createTabCtrl.js b/src/app/pages/surveys/create/createTabCtrl.js index 8b0c32f..c7130da 100644 --- a/src/app/pages/surveys/create/createTabCtrl.js +++ b/src/app/pages/surveys/create/createTabCtrl.js @@ -257,7 +257,7 @@ $scope.survey.list = $scope.lists.selected; $scope.survey.status = "Sending"; $log.info("sendSurvey",$scope.survey); - $state.transitionTo('surveys.list'/*, {id: item.id}*/); + $state.transitionTo('main.surveys.list'/*, {id: item.id}*/); $scope.saveSurvey(true); diff --git a/src/app/pages/surveys/list/list.controller.js b/src/app/pages/surveys/list/list.controller.js index 1c2c369..53f04e6 100644 --- a/src/app/pages/surveys/list/list.controller.js +++ b/src/app/pages/surveys/list/list.controller.js @@ -23,12 +23,12 @@ function goToCreate() { $log.info("Go to create"); - $state.go('surveys.create'); + $state.go('main.surveys.create'); } function editSurvey(id){ $log.info("Edit"); - $state.go('surveys.edit', {'survey_id': id}) + $state.go('main.surveys.edit', {'survey_id': id}) }; function removeSurvey(id){ diff --git a/src/app/pages/surveys/surveys.module.js b/src/app/pages/surveys/surveys.module.js index 2aae291..52b3af4 100644 --- a/src/app/pages/surveys/surveys.module.js +++ b/src/app/pages/surveys/surveys.module.js @@ -13,7 +13,7 @@ /** @ngInject */ function routeConfig($stateProvider) { $stateProvider - .state('surveys', { + .state('main.surveys', { url: '/surveys', template : '', title: 'Surveys', @@ -21,7 +21,7 @@ icon: 'ion-gear-a', order: 1000, }, - }).state('surveys.create', { + }).state('main.surveys.create', { url: '/create', templateUrl: 'app/pages/surveys/create/create.html', controller: "CreateTabCtrl", @@ -29,12 +29,12 @@ sidebarMeta: { order: 1000, }, - }).state('surveys.edit', { + }).state('main.surveys.edit', { url: '/edit/:survey_id', templateUrl: 'app/pages/surveys/create/create.html', controller: "CreateTabCtrl", title: 'Edit a survey' - }).state('surveys.list', { + }).state('main.surveys.list', { url: '/list', templateUrl: 'app/pages/surveys/list/list.html', controller: "list as vm", diff --git a/src/app/pages/teams/lists/ListsTabCtrl.js b/src/app/pages/teams/lists/ListsTabCtrl.js index a94607d..0c00b88 100644 --- a/src/app/pages/teams/lists/ListsTabCtrl.js +++ b/src/app/pages/teams/lists/ListsTabCtrl.js @@ -169,7 +169,7 @@ if (item && item.isChecked) { vm.activeList = item; vm.errors.noList = false; - $state.transitionTo('teams.lists', {id: item.id}, {notify: false}); + $state.transitionTo('main.teams.lists', {id: item.id}, {notify: false}); angular.forEach(vm.Lists, function(list){ if(item.id != list.id) list.isChecked = false; @@ -201,7 +201,7 @@ vm.activeList = {}; vm.errors.noList = true; vm.listMembers = []; - $state.transitionTo('teams.lists', {notify: false}); + $state.transitionTo('main.teams.lists', {notify: false}); } diff --git a/src/app/pages/teams/lists/lists.module.js b/src/app/pages/teams/lists/lists.module.js index 51b1580..76f9143 100644 --- a/src/app/pages/teams/lists/lists.module.js +++ b/src/app/pages/teams/lists/lists.module.js @@ -11,7 +11,7 @@ /** @ngInject */ function routeConfig($stateProvider,$urlRouterProvider) { $stateProvider - .state('teams.lists', { + .state('main.teams.lists', { url: '/lists/:id', //abstract: true, templateUrl: 'app/pages/teams/lists/lists.html', diff --git a/src/app/pages/teams/members/composeBox/composeBoxCtrl.js b/src/app/pages/teams/members/composeBox/composeBoxCtrl.js index 9c5cb76..338381e 100644 --- a/src/app/pages/teams/members/composeBox/composeBoxCtrl.js +++ b/src/app/pages/teams/members/composeBox/composeBoxCtrl.js @@ -50,7 +50,7 @@ .create(vm.member) .then(function (data){ vm.member = {} - $state.go('teams.members'); + $state.go('main.teams.members'); toastr.info('The member was created successfuly :)', 'Members', { "autoDismiss": true, diff --git a/src/app/pages/teams/members/detail/memberDetail.html b/src/app/pages/teams/members/detail/memberDetail.html index 37688c5..03727e8 100644 --- a/src/app/pages/teams/members/detail/memberDetail.html +++ b/src/app/pages/teams/members/detail/memberDetail.html @@ -5,7 +5,7 @@ - diff --git a/src/app/pages/teams/members/members.html b/src/app/pages/teams/members/members.html index 4c51d20..87402f7 100644 --- a/src/app/pages/teams/members/members.html +++ b/src/app/pages/teams/members/members.html @@ -15,7 +15,7 @@
+ ui-sref="main.teams.members.label({label: t.label})" ng-click="tabCtrl.selectTab(t.label)"> {{t.name}}
diff --git a/src/app/pages/teams/members/members.module.js b/src/app/pages/teams/members/members.module.js index c1e29e6..c935965 100644 --- a/src/app/pages/teams/members/members.module.js +++ b/src/app/pages/teams/members/members.module.js @@ -11,7 +11,7 @@ /** @ngInject */ function routeConfig($stateProvider,$urlRouterProvider) { $stateProvider - .state('teams.members', { + .state('main.teams.members', { url: '/members', //abstract: true, templateUrl: 'app/pages/teams/members/members.html', @@ -21,13 +21,13 @@ sidebarMeta: { order: 0, }, - }).state('teams.members.label', { + }).state('main.teams.members.label', { url: '/:label', templateUrl: 'app/pages/teams/members/membersListing/membersList.html', title: 'Members', controller: "MembersListCtrl", controllerAs: "listCtrl" - }).state('teams.members.detail', { + }).state('main.teams.members.detail', { url: '/:id', templateUrl: 'app/pages/teams/members/detail/memberDetail.html', title: 'Detail', diff --git a/src/app/pages/teams/members/membersListing/membersList.html b/src/app/pages/teams/members/membersListing/membersList.html index 5abfc46..cad563c 100644 --- a/src/app/pages/teams/members/membersListing/membersList.html +++ b/src/app/pages/teams/members/membersListing/membersList.html @@ -34,11 +34,11 @@
- + - +
{{m.name}}
{{l}}
diff --git a/src/app/pages/teams/teams.module.js b/src/app/pages/teams/teams.module.js index fa98b42..1bd3923 100644 --- a/src/app/pages/teams/teams.module.js +++ b/src/app/pages/teams/teams.module.js @@ -15,7 +15,7 @@ /** @ngInject */ function routeConfig($stateProvider) { $stateProvider - .state('teams', { + .state('main.teams', { url: '/teams', template : '', abstract: true, diff --git a/src/app/theme/components/baSidebar/baSidebar.service.js b/src/app/theme/components/baSidebar/baSidebar.service.js index 3c19627..b3631d7 100644 --- a/src/app/theme/components/baSidebar/baSidebar.service.js +++ b/src/app/theme/components/baSidebar/baSidebar.service.js @@ -73,7 +73,8 @@ return { name: s.name, title: s.title, - level: (s.name.match(/\./g) || []).length, + //level: (s.name.match(/\./g) || []).length, + level: ((s.name.match(/\./g) || []).length - 1), order: meta.order, icon: meta.icon, stateRef: s.name, diff --git a/src/index.html b/src/index.html index 21ac58e..e602006 100644 --- a/src/index.html +++ b/src/index.html @@ -1,5 +1,6 @@ + @@ -23,57 +24,29 @@ + + -
-
+
- - + + + + + + -
-
- -
-
-
+ + + + -
- - -
- - -
- -
-
-
- - - - - - - - - - - - - - - - - + + + + + \ No newline at end of file diff --git a/src/sass/auth.scss b/src/sass/auth.scss index 6969ab9..8d4f138 100644 --- a/src/sass/auth.scss +++ b/src/sass/auth.scss @@ -3,7 +3,6 @@ @import "theme/_layout.scss"; @import 'theme/buttons.scss'; @import 'app/form.scss'; - html { min-height: 520px; height: 100%; @@ -15,14 +14,17 @@ body { } $text-color: #ffffff; - -.form-control, .form-control:focus { +.form-control, +.form-control:focus { @include placeholderStyle($text-color, 0.9); background-color: rgba(0, 0, 0, .4); border-radius: 5px; color: $text-color; } -.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { @include placeholderStyle($text-color, 0.6); } @@ -57,12 +59,10 @@ $text-color: #ffffff; color: $primary-dark; } } - .control-label { padding-top: 11px; color: $text-color; } - .form-group { margin-bottom: 12px; } @@ -105,18 +105,19 @@ a.forgot-pass { text-align: center; display: block; position: relative; - & > span { + &>span { display: table-cell; width: 30%; white-space: nowrap; padding: 0 24px; color: $text-color; - & > span { + &>span { margin-top: -12px; display: block; } } - &:before, &:after { + &:before, + &:after { border-top: solid 1px $text-color; content: ""; height: 1px; diff --git a/src/sass/common.scss b/src/sass/common.scss index df04ce9..552b18e 100644 --- a/src/sass/common.scss +++ b/src/sass/common.scss @@ -1,3 +1,4 @@ @import 'theme/conf/mixins'; @import 'theme/conf/colorScheme/mint'; @import 'theme/conf/variables'; +@import 'theme/_login.scss'; diff --git a/src/sass/theme/_login.scss b/src/sass/theme/_login.scss new file mode 100644 index 0000000..8c1b57b --- /dev/null +++ b/src/sass/theme/_login.scss @@ -0,0 +1,141 @@ +.login { + min-height: 520px; + @include main-background(); + height: 100%; +} + +$text-color: #ffffff; +.login .form-control, +.login .form-control:focus { + @include placeholderStyle($text-color, 0.9); + background-color: rgba(0, 0, 0, .4); + border-radius: 5px; + color: $text-color; +} + +.login .form-control[disabled], +.login .form-control[readonly], +fieldset[disabled] .form-control { + @include placeholderStyle($text-color, 0.6); +} + +.auth-main { + display: flex; + align-items: center; + height: 100%; + width: 100%; +} + +.login .auth-block { + width: 540px; + margin: 150px auto; + border-radius: 5px; + @include bg-translucent-dark(0.55); + color: #fff; + padding: 32px; + h1 { + font-weight: $font-light; + margin-bottom: 28px; + text-align: center; + } + p { + font-size: 16px; + } + a { + text-decoration: none; + outline: none; + transition: all 0.2s ease; + color: $primary; + &:hover { + color: $primary-dark; + } + } + .control-label { + padding-top: 11px; + color: $text-color; + } + .form-group { + margin-bottom: 12px; + } +} + +.login .auth-input { + width: 300px; + margin-bottom: 24px; + input { + display: block; + width: 100%; + border: none; + font-size: 16px; + padding: 4px 10px; + outline: none; + } +} + +.login a.forgot-pass { + display: block; + text-align: right; + margin-bottom: -20px; + float: right; + z-index: 2; + position: relative; +} + +.login .auth-link { + display: block; + font-size: 16px; + text-align: center; + margin-bottom: 33px; +} + +.login .auth-sep { + margin-top: 36px; + margin-bottom: 24px; + line-height: 20px; + font-size: 16px; + text-align: center; + display: block; + position: relative; + &>span { + display: table-cell; + width: 30%; + white-space: nowrap; + padding: 0 24px; + color: $text-color; + &>span { + margin-top: -12px; + display: block; + } + } + &:before, + &:after { + border-top: solid 1px $text-color; + content: ""; + height: 1px; + width: 35%; + display: table-cell; + } +} + +.login .al-share-auth { + text-align: center; + .al-share { + float: none; + margin: 0; + padding: 0; + display: inline-block; + li { + margin-left: 24px; + &:first-child { + margin-left: 0; + } + i { + font-size: 24px; + } + } + } +} + +.login .btn-auth { + color: #ffffff!important; +} \ No newline at end of file