diff --git a/services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee b/services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee index 5debc762b0..d32ba6233f 100644 --- a/services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee +++ b/services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee @@ -46,11 +46,15 @@ module.exports = else if err? and err?.message?.indexOf("could not be validated") != -1 logger.log {oldEmail, newEmail}, "unable to change email in newsletter, user has previously unsubscribed or new email already exist on list" - return callback(err) + return callback() else if err? and err.message.indexOf("is already a list member") != -1 logger.log {oldEmail, newEmail}, "unable to change email in newsletter, new email is already on mailing list" return callback() + else if err? and err?.message?.indexOf("looks fake or invalid") != -1 + logger.log {oldEmail, newEmail}, + "unable to change email in newsletter, email looks fake to mailchimp" + return callback() else if err? logger.err {err, oldEmail, newEmail}, "error changing email in newsletter" return callback(err) diff --git a/services/web/app/coffee/Features/Subscription/DomainLicenceController.coffee b/services/web/app/coffee/Features/Subscription/DomainLicenceController.coffee index 82fd4671f1..f131b0118e 100644 --- a/services/web/app/coffee/Features/Subscription/DomainLicenceController.coffee +++ b/services/web/app/coffee/Features/Subscription/DomainLicenceController.coffee @@ -18,9 +18,9 @@ module.exports = jobs = partOfGroup: (cb)-> - SubscriptionGroupHandler.isUserPartOfGroup user.id, licence.group_subscription_id, cb + SubscriptionGroupHandler.isUserPartOfGroup user._id, licence.group_subscription_id, cb subscription: (cb)-> - SubscriptionLocator.getUsersSubscription user.id, cb + SubscriptionLocator.getUsersSubscription user._id, cb async.series jobs, (err, results)-> { partOfGroup, subscription } = results diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index cf1bf59ebd..2b7ca06ca8 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -15,30 +15,33 @@ planFeatures = require './planFeatures' module.exports = SubscriptionController = plansPage: (req, res, next) -> - plans = SubscriptionViewModelBuilder.buildViewModel() - viewName = "subscriptions/plans" - if req.query.v? - viewName = "#{viewName}_#{req.query.v}" - logger.log viewName:viewName, "showing plans page" - currentUser = null + if Settings.overleaf? && !req.query.plns + res.redirect "#{Settings.overleaf.host}/plans" + else + plans = SubscriptionViewModelBuilder.buildViewModel() + viewName = "subscriptions/plans" + if req.query.v? + viewName = "#{viewName}_#{req.query.v}" + logger.log viewName:viewName, "showing plans page" + currentUser = null - GeoIpLookup.getCurrencyCode req.query?.ip || req.ip, (err, recomendedCurrency)-> - return next(err) if err? - render = () -> - res.render viewName, - title: "plans_and_pricing" - plans: plans - gaExperiments: Settings.gaExperiments.plansPage - recomendedCurrency:recomendedCurrency - planFeatures: planFeatures - user_id = AuthenticationController.getLoggedInUserId(req) - if user_id? - UserGetter.getUser user_id, {signUpDate: 1}, (err, user) -> - return next(err) if err? - currentUser = user + GeoIpLookup.getCurrencyCode req.query?.ip || req.ip, (err, recomendedCurrency)-> + return next(err) if err? + render = () -> + res.render viewName, + title: "plans_and_pricing" + plans: plans + gaExperiments: Settings.gaExperiments.plansPage + recomendedCurrency:recomendedCurrency + planFeatures: planFeatures + user_id = AuthenticationController.getLoggedInUserId(req) + if user_id? + UserGetter.getUser user_id, {signUpDate: 1}, (err, user) -> + return next(err) if err? + currentUser = user + render() + else render() - else - render() #get to show the recurly.js page paymentPage: (req, res, next) -> diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee index 9e9cc702f5..8950e3c5bd 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee @@ -9,11 +9,7 @@ module.exports = apply: (webRouter, privateApiRouter, publicApiRouter) -> return unless Settings.enableSubscriptions - if Settings.overleaf? - webRouter.get '/user/subscription/plans', (req, res) -> - res.redirect "#{Settings.overleaf.host}/plans" - else - webRouter.get '/user/subscription/plans', SubscriptionController.plansPage + webRouter.get '/user/subscription/plans', SubscriptionController.plansPage webRouter.get '/user/subscription', AuthenticationController.requireLogin(), SubscriptionController.userSubscriptionPage diff --git a/services/web/app/coffee/Features/User/UserUpdater.coffee b/services/web/app/coffee/Features/User/UserUpdater.coffee index 3abffdf444..c8f35eba10 100644 --- a/services/web/app/coffee/Features/User/UserUpdater.coffee +++ b/services/web/app/coffee/Features/User/UserUpdater.coffee @@ -112,7 +112,8 @@ module.exports = UserUpdater = else if res.n == 0 # TODO: Check n or nMatched? return callback(new Error('Default email does not belong to user')) else - NewsletterManager.changeEmail oldEmail, email, callback + NewsletterManager.changeEmail oldEmail, email, -> + callback() diff --git a/services/web/app/views/subscriptions/_plans_faq.pug b/services/web/app/views/subscriptions/_plans_faq.pug index 7f35c23738..ba99521d4d 100644 --- a/services/web/app/views/subscriptions/_plans_faq.pug +++ b/services/web/app/views/subscriptions/_plans_faq.pug @@ -6,7 +6,7 @@ .row .col-md-6 h3 #{translate("faq_how_free_trial_works_question")} - p #{translate('faq_how_free_trial_works_answer', { len:'{{trial_len}}' })} + p #{translate('faq_how_does_free_trial_works_answer', { appName:'{{settings.appName}}', len:'{{trial_len}}' })} .col-md-6 h3 #{translate('faq_change_plans_question')} p #{translate('faq_change_plans_answer')} @@ -16,11 +16,18 @@ p #{translate('faq_do_collab_need_premium_answer')} .col-md-6 h3 #{translate('faq_need_more_collab_question')} - p !{translate('faq_need_more_collab_answer', { referFriendsLink: '' + translate('referring_your_friends') + ''})} + if settings.overleaf + p !{translate('faq_need_more_collab_answer', { referFriendsLink: translate('referring_your_friends') })} + else + p !{translate('faq_need_more_collab_answer', { referFriendsLink: '' + translate('referring_your_friends') + ''})} .row .col-md-6 h3 #{translate('faq_purchase_more_licenses_question')} - p !{translate('faq_purchase_more_licenses_answer', { groupLink: '' + translate('discounted_group_accounts') + '' })} + if settings.overleaf + p !{translate('faq_purchase_more_licenses_answer', { groupLink: translate('discounted_group_accounts') })}  + a(href, ng-click="openGroupPlanModal()") #{translate("get_in_touch_for_details")} + else + p !{translate('faq_purchase_more_licenses_answer', { groupLink: '' + translate('discounted_group_accounts') + '' })} .col-md-6 h3 #{translate('faq_monthly_or_annual_question')} p #{translate('faq_monthly_or_annual_answer')} @@ -30,4 +37,7 @@ p #{translate('faq_how_to_pay_answer')} .col-md-6 h3 #{translate('faq_pay_by_invoice_question')} - p !{translate('faq_pay_by_invoice_answer', { groupLink: '' + translate('discounted_group_accounts') + '' })} + if settings.overleaf + p !{translate('faq_pay_by_invoice_answer', { groupLink: translate('discounted_group_accounts') })} + else + p !{translate('faq_pay_by_invoice_answer', { groupLink: '' + translate('discounted_group_accounts') + '' })} \ No newline at end of file diff --git a/services/web/app/views/subscriptions/_plans_page_mixins.pug b/services/web/app/views/subscriptions/_plans_page_mixins.pug index 6dd91a79f3..d320cd5238 100644 --- a/services/web/app/views/subscriptions/_plans_page_mixins.pug +++ b/services/web/app/views/subscriptions/_plans_page_mixins.pug @@ -1,20 +1,23 @@ //- Buy Buttons mixin btn_buy_collaborator(location) - a.btn.btn-info( + a.btn( + class=settings.overleaf ? 'btn-primary' : 'btn-info' ng-href="/user/subscription/new?planCode={{ getCollaboratorPlanCode() }}¤cy={{currencyCode}}", ng-click="signUpNowClicked('collaborator','" + location + "')" ) span(ng-show="ui.view != 'annual'") #{translate("start_free_trial")} span(ng-show="ui.view == 'annual'") #{translate("buy_now")} mixin btn_buy_free(location) - a.btn.btn-info( + a.btn( + class=settings.overleaf ? 'btn-primary' : 'btn-info' href="/register" style=(getLoggedInUserId() === null ? "" : "visibility: hidden") ng-click="signUpNowClicked('free','" + location + "')" ) span.text-capitalize #{translate('get_started_now')} mixin btn_buy_professional(location) - a.btn.btn-info( + a.btn( + class=settings.overleaf ? 'btn-primary' : 'btn-info' ng-href="/user/subscription/new?planCode=professional{{ ui.view == 'annual' && '-annual' || planQueryString}}¤cy={{currencyCode}}" ng-click="signUpNowClicked('professional','" + location + "')" ) @@ -22,13 +25,15 @@ mixin btn_buy_professional(location) span(ng-show="ui.view == 'annual'") #{translate("buy_now")} mixin btn_buy_student(location, plan) if plan == 'annual' - a.btn.btn-info( + a.btn( + class=settings.overleaf ? 'btn-primary' : 'btn-info' ng-href="/user/subscription/new?planCode=student-annual¤cy={{currencyCode}}", ng-click="signUpNowClicked('student-annual','" + location + "')" ) #{translate("buy_now")} else //- planQueryString will contain _free_trial_7_days - a.btn.btn-info( + a.btn( + class=settings.overleaf ? 'btn-primary' : 'btn-info' ng-href="/user/subscription/new?planCode=student{{planQueryString}}¤cy={{currencyCode}}", ng-click="signUpNowClicked('student-monthly','" + location + "')" ) #{translate("start_free_trial")} diff --git a/services/web/app/views/subscriptions/_plans_quotes.pug b/services/web/app/views/subscriptions/_plans_quotes.pug new file mode 100644 index 0000000000..afb1b2baa5 --- /dev/null +++ b/services/web/app/views/subscriptions/_plans_quotes.pug @@ -0,0 +1,25 @@ +.row.row-spaced-large + .col-md-12 + .page-header.plans-header.plans-subheader.text-centered + h2 #{translate('in_good_company')} +.row + .col-md-6 + div + .row + .col-md-3 + .circle-img + img(src=buildImgPath('advocates/erdogmus.jpg') alt="Professor Erdogmus") + .col-md-9 + blockquote + p The ability to track changes and the real-time collaborative nature is what sets ShareLaTeX apart. + footer Professor Erdogmus, Northeastern University + .col-md-6 + div + .row + .col-md-3 + .circle-img + img(src=buildImgPath('advocates/henderson.jpg') alt="Rob Henderson") + .col-md-9 + blockquote + p ShareLaTeX has proven to be a powerful and robust collaboration tool that is widely used in our School. + footer Rob Henderson, School Of Informatics And Computing - Indiana University \ No newline at end of file diff --git a/services/web/app/views/subscriptions/new.pug b/services/web/app/views/subscriptions/new.pug index afbb066162..ce21dca584 100644 --- a/services/web/app/views/subscriptions/new.pug +++ b/services/web/app/views/subscriptions/new.pug @@ -14,7 +14,7 @@ block content .container(ng-controller="NewSubscriptionController" ng-cloak) .row.card-group .col-md-5.col-md-push-4 - .card.card-highlighted + .card.card-highlighted(class=settings.overleaf ? 'card-border' : '') .page-header .row .col-xs-9 @@ -250,12 +250,13 @@ block content hr p.small.text-center We're confident that you'll love #{settings.appName}, but if not you can cancel anytime. We'll give you your money back, no questions asked, if you let us know within 30 days. - hr - span                   - a(href="https://www.positivessl.com" style="font-family: arial; font-size: 10px; color: #212121; text-decoration: none;") - img(src="https://www.positivessl.com/images-new/PositiveSSL_tl_trans.png" alt="SSL Certificate" title="SSL Certificate" border="0") - div(style="font-family: arial;font-weight:bold;font-size:15px;color:#86BEE0;") - a(href="https://www.positivessl.com" style="color:#86BEE0; text-decoration: none;") + if !settings.overleaf + hr + span                   + a(href="https://www.positivessl.com" style="font-family: arial; font-size: 10px; color: #212121; text-decoration: none;") + img(src="https://www.positivessl.com/images-new/PositiveSSL_tl_trans.png" alt="SSL Certificate" title="SSL Certificate" border="0") + div(style="font-family: arial;font-weight:bold;font-size:15px;color:#86BEE0;") + a(href="https://www.positivessl.com" style="color:#86BEE0; text-decoration: none;") script(type="text/javascript"). diff --git a/services/web/app/views/subscriptions/plans.pug b/services/web/app/views/subscriptions/plans.pug index 33346d4a52..4709b414c0 100644 --- a/services/web/app/views/subscriptions/plans.pug +++ b/services/web/app/views/subscriptions/plans.pug @@ -15,7 +15,7 @@ block content .row .col-md-12 .page-header.centered.plans-header.text-centered - h1.text-capitalize #{translate('instant_access')} + h1.text-capitalize #{translate('get_instant_access_to')} #{settings.appName} .row .col-md-8.col-md-offset-2 p.text-centered #{translate("sl_benefits_plans")} @@ -89,7 +89,13 @@ block content span #{translate('reduce_costs_group_licenses')} br br - a.btn.btn-info(href="/i/university/groups") #{translate('find_out_more')} + if settings.overleaf + a.btn.btn-default( + href + ng-click="openGroupPlanModal()" + ) #{translate('find_out_more')} + else + a.btn.btn-info(href="/i/university/groups") #{translate('find_out_more')} div .row.row-spaced-large @@ -107,31 +113,8 @@ block content .col-sm-12(ng-if="ui.view == 'student'") +table_student - .row.row-spaced-large - .col-md-12 - .page-header.plans-header.plans-subheader.text-centered - h2 #{translate('in_good_company')} - .row - .col-md-6 - div - .row - .col-md-3 - .circle-img - img(src=buildImgPath('advocates/erdogmus.jpg') alt="Professor Erdogmus") - .col-md-9 - blockquote - p The ability to track changes and the real-time collaborative nature is what sets ShareLaTeX apart. - footer Professor Erdogmus, Northeastern University - .col-md-6 - div - .row - .col-md-3 - .circle-img - img(src=buildImgPath('advocates/henderson.jpg') alt="Rob Henderson") - .col-md-9 - blockquote - p ShareLaTeX has proven to be a powerful and robust collaboration tool that is widely used in our School. - footer Rob Henderson, School Of Informatics And Computing - Indiana University + if !settings.overleaf + include _plans_quotes include _plans_faq @@ -139,8 +122,13 @@ block content .col-md-12 .plans-header.plans-subheader.text-centered h2 #{translate('still_have_questions')} - button.btn.btn-info.btn-header.text-capitalize(ng-controller="ContactGeneralModal" ng-click="openModal()") #{translate('get_in_touch')} + button.btn.btn-header.text-capitalize( + class=settings.overleaf ? 'btn-default' : 'btn-info' + ng-controller="ContactGeneralModal" + ng-click="openModal()" + ) #{translate('get_in_touch')} != moduleIncludes("contactModalGeneral", locals) .row.row-spaced + include _modal_group_inquiry diff --git a/services/web/app/views/user/settings/user-affiliations.pug b/services/web/app/views/user/settings/user-affiliations.pug index 3527beb05a..d997d7952d 100644 --- a/services/web/app/views/user/settings/user-affiliations.pug +++ b/services/web/app/views/user/settings/user-affiliations.pug @@ -202,6 +202,8 @@ script(type="text/ng-template", id="affiliationFormTpl") ) {{ $select.selected.name }} ui-select-choices( repeat="university in $ctrl.universities | filter: $select.search" + refresh="$ctrl.handleFreeformInputChange($select, 'name');" + refresh-delay="10" ) span( ng-bind="university.name" @@ -219,6 +221,8 @@ script(type="text/ng-template", id="affiliationFormTpl") ) {{ $select.selected }} ui-select-choices( repeat="role in $ctrl.roles | filter: $select.search" + refresh="$ctrl.handleFreeformInputChange($select);" + refresh-delay="10" ) span( ng-bind="role" @@ -237,6 +241,8 @@ script(type="text/ng-template", id="affiliationFormTpl") ) {{ $select.selected }} ui-select-choices( repeat="department in $ctrl.departments | filter: $select.search" + refresh="$ctrl.handleFreeformInputChange($select);" + refresh-delay="10" ) span( ng-bind="department" diff --git a/services/web/public/coffee/main/affiliations/components/affiliationForm.coffee b/services/web/public/coffee/main/affiliations/components/affiliationForm.coffee index 1c0c7d6229..1f018595ec 100644 --- a/services/web/public/coffee/main/affiliations/components/affiliationForm.coffee +++ b/services/web/public/coffee/main/affiliations/components/affiliationForm.coffee @@ -11,6 +11,18 @@ define [ ctrl.addUniversityToSelection = (universityName) -> { name: universityName, isUserSuggested: true } + ctrl.handleFreeformInputChange = ($select, propertyToMatch) -> + if !$select.search? or $select.search == "" + return + resultingItem = $select.search + if $select.tagging?.fct? + resultingItem = $select.tagging.fct $select.search + if propertyToMatch? + matchingItem = _.find $select.items, (item) -> item[propertyToMatch] == $select.search + if matchingItem? + resultingItem = matchingItem + $select.searchInput.scope().$broadcast "uis:select", resultingItem + # Populates the countries dropdown UserAffiliationsDataService .getCountries() diff --git a/services/web/public/stylesheets/app/plans-ol.less b/services/web/public/stylesheets/app/plans-ol.less new file mode 100644 index 0000000000..948aeec57e --- /dev/null +++ b/services/web/public/stylesheets/app/plans-ol.less @@ -0,0 +1,14 @@ + +.plans { + blockquote { + footer{ + /* accessibility fix */ + color: @ol-blue-gray-3; + } + } + .plans-header{ + h1, h2 { + color: @gray-dark; + } + } +} \ No newline at end of file diff --git a/services/web/public/stylesheets/app/plans.less b/services/web/public/stylesheets/app/plans.less index bd10425425..3676dd4594 100644 --- a/services/web/public/stylesheets/app/plans.less +++ b/services/web/public/stylesheets/app/plans.less @@ -4,8 +4,9 @@ margin-bottom: @line-height-computed; } .best-value { - color: @red; + color: @brand-secondary; line-height: @line-height-computed; + text-transform: capitalize; } blockquote { footer{ @@ -20,6 +21,22 @@ text-shadow: 0 0 0; } .card .btn { white-space:normal; } + .card.features { + margin-top: @line-height-computed; + i { + color: @red; + } + p { + margin: 0; + } + } + .btn-header { + font-family: @font-family-sans-serif; + margin-left: 10px; + margin-top: -10px; + text-shadow: 0 0 0; + } + .card .btn { white-space:normal; } .card-group { .card-highlighted { padding-top: @line-height-computed * 2; @@ -27,10 +44,10 @@ } } .card-first, .card-last { - background: @white-med; + background: @plans-non-highlighted; } .card-highlighted { - border: @highlight-border solid @gray-lighter; + border: @border-width-base solid @border-color-base; padding-top: 10px!important; .best-value { margin-bottom: 15px; @@ -51,7 +68,7 @@ width: 120px; height: 120px; border-radius: 50%; - background-color: @red; + background-color: @brand-secondary; color: white; white-space: nowrap; span.small { @@ -148,10 +165,8 @@ Plans Test */ @best-val-height: 35px; -@highlight-border: 3px; -@highlight-color: #d3584b; +@border-width-base: 3px; @gray-med: #6d6d6d; -@white-med: #fdfdfd; /* Media Queries */ @media (max-width: @screen-sm-max) { @@ -192,7 +207,7 @@ */ .plans-table { border: 1px solid @gray-lighter; - background-color: @white-med; + background-color: @plans-non-highlighted; margin: @best-val-height 0 15px 0; table-layout: fixed; width: 100%; @@ -215,8 +230,8 @@ border-top: 0; font-family: @headings-font-family; font-size: @font-size-h2; - font-weight: @headings-font-weight; - line-height: @headings-line-height; + font-weight: @headings-font-weight; + line-height: @headings-line-height; padding: 18px; } @@ -246,13 +261,13 @@ border-bottom: 0; padding: 18px; } - /* highlighted column */ + /* highlighted column */ td:nth-child(3) { position: relative; /* keep here position here, otherwise messes up border on safari when there is a bg color */ &:before { /* needed for safafi */ - border-top: 1px solid @gray-lighter; + border-top: 1px solid @border-color-base; content: ''; left: 0; position: absolute; @@ -277,17 +292,17 @@ /* highlighted column */ td:nth-child(3), th:nth-child(3) { background-color: white; - border-left: @highlight-border solid @gray-lighter; - border-right: @highlight-border solid @gray-lighter; + border-left: @border-width-base solid @border-color-base; + border-right: @border-width-base solid @border-color-base; } .outer { - left: -@highlight-border; - right: -@highlight-border; + left: -@border-width-base; + right: -@border-width-base; position: absolute; .outer-content { background: white; - border: @highlight-border solid @gray-lighter; + border: @border-width-base solid @border-color-base; border-radius: @border-radius-base; font-size: @font-size-base; font-family: @font-family-sans-serif; @@ -317,7 +332,7 @@ /* highlight rows on hover */ tr:hover { td { - background-color: @gray-lightest; + background-color: @table-hover-bg; } } tr:first-child:hover { @@ -332,7 +347,7 @@ /* tooltip */ sup { - color: @red; + color: @brand-secondary; cursor: pointer; margin-left: 5px; } diff --git a/services/web/public/stylesheets/app/subscription.less b/services/web/public/stylesheets/app/subscription.less index f2ff53250b..87bdfdc418 100644 --- a/services/web/public/stylesheets/app/subscription.less +++ b/services/web/public/stylesheets/app/subscription.less @@ -44,16 +44,16 @@ border: solid 1px @gray-lighter; border-radius: @border-radius-large 0 0 @border-radius-large; padding: (@line-height-computed / 2); - color: @gray; + color: @btn-switch-color; &:hover, &:focus { - color: @gray; + color: @btn-switch-color; text-decoration: none; } &:hover { - color: @gray-dark; + color: @btn-switch-hover-color; } & + & { @@ -62,12 +62,12 @@ } &-selected { - color: @link-color; + color: @link-active-color; box-shadow: inset 0 -2px 0 0; &:hover, &:focus { - color: @link-color; + color: @link-active-color; } } } diff --git a/services/web/public/stylesheets/components/card.less b/services/web/public/stylesheets/components/card.less index ac43c038b7..afa0dd2480 100644 --- a/services/web/public/stylesheets/components/card.less +++ b/services/web/public/stylesheets/components/card.less @@ -50,4 +50,8 @@ border-bottom-right-radius: @border-radius-base; } } +} + +.card-border { + border: @border-width-base solid @border-color-base; } \ No newline at end of file diff --git a/services/web/public/stylesheets/components/navs-ol.less b/services/web/public/stylesheets/components/navs-ol.less new file mode 100644 index 0000000000..f11673ac3d --- /dev/null +++ b/services/web/public/stylesheets/components/navs-ol.less @@ -0,0 +1,7 @@ +.nav-pills { + > li { + > a { + border-radius: @btn-border-radius-base; + } + } +} \ No newline at end of file diff --git a/services/web/public/stylesheets/components/navs.less b/services/web/public/stylesheets/components/navs.less index 0616da1b8c..dc415dc6a3 100755 --- a/services/web/public/stylesheets/components/navs.less +++ b/services/web/public/stylesheets/components/navs.less @@ -123,8 +123,14 @@ // Links rendered as pills > a { border-radius: @nav-pills-border-radius; - border: 2px solid @link-color; + border: 2px solid @nav-pills-link-color; + color: @nav-pills-link-color; padding: 8px 13px; + &:hover, + &:focus { + background-color: @nav-pills-link-hover-bg; + border: 2px solid @nav-pills-link-hover-bg; + } } + li { margin-left: 2px; @@ -136,6 +142,7 @@ &:hover, &:focus { color: @nav-pills-active-link-hover-color; + border: 2px solid @nav-pills-active-link-hover-bg; background-color: @nav-pills-active-link-hover-bg; } } @@ -247,4 +254,4 @@ margin-top: -1px; // Remove the top rounded corners here since there is a hard edge above the menu .border-top-radius(0); -} +} \ No newline at end of file diff --git a/services/web/public/stylesheets/core/_common-variables.less b/services/web/public/stylesheets/core/_common-variables.less index 5e166c85d6..9d7eab3493 100644 --- a/services/web/public/stylesheets/core/_common-variables.less +++ b/services/web/public/stylesheets/core/_common-variables.less @@ -13,6 +13,7 @@ //** Global textual link color. @link-color: @brand-primary; +@link-active-color: @link-color; //** Link hover color set via `darken()` function. @link-hover-color: darken(@link-color, 15%); @@ -87,6 +88,12 @@ @border-radius-base: 3px; @border-radius-large: 5px; @border-radius-small: 2px; +@border-width-base: 3px; +@border-color-base: @gray-lighter; + +@btn-switch-color: @gray; +@btn-switch-hover-color: @gray-dark; + //** Global color for active items (e.g., navs or dropdowns). @component-active-color: #fff; //** Global background color for active items (e.g., navs or dropdowns). @@ -370,6 +377,9 @@ @nav-tabs-justified-active-link-border-color: @body-bg; //== Pills +@nav-pills-link-color: @link-color; +@nav-pills-link-hover-color: @nav-link-hover-bg; +@nav-pills-link-hover-bg: @nav-link-hover-bg; @nav-pills-border-radius: @border-radius-base; @nav-pills-active-link-hover-bg: @component-active-bg; @nav-pills-active-link-hover-color: @component-active-color; @@ -412,6 +422,10 @@ @pager-disabled-color: @pagination-disabled-color; +// Plans +@table-hover-bg: @gray-lightest; +@plans-non-highlighted: #fdfdfd; + //== Jumbotron // //## diff --git a/services/web/public/stylesheets/core/ol-variables.less b/services/web/public/stylesheets/core/ol-variables.less index f5ca77cf04..fb242e831a 100644 --- a/services/web/public/stylesheets/core/ol-variables.less +++ b/services/web/public/stylesheets/core/ol-variables.less @@ -34,14 +34,22 @@ @navbar-default-border : transparent; @navbar-brand-image-url : url(/img/ol-brand/overleaf-white.svg); @navbar-default-link-bg : transparent; +@nav-pills-active-link-hover-bg: @ol-dark-green; +@nav-pills-link-color : @btn-default-bg; +@nav-pills-link-hover-bg : darken(@ol-blue-gray-4, 8%); // match button-variant mixin + // Backgrounds @body-bg : #FFF; @content-alt-bg-color : @ol-blue-gray-1; +// Border +@border-color-base: @ol-blue-gray-2; + // Typography @text-small-color : @ol-type-color; @text-color : @ol-type-color; @link-color : @ol-blue; +@link-active-color : @ol-dark-green; @link-hover-color : @ol-dark-blue; // Button colors and sizing @@ -68,6 +76,9 @@ @btn-info-bg : @ol-blue; @btn-info-border : transparent; +@btn-switch-color : @ol-blue-gray-4; +@btn-switch-hover-color : darken(@ol-blue-gray-4, 8%); + // Padding @padding-xs-horizontal : 8px; @@ -308,6 +319,10 @@ @log-line-no-color : #FFF; @log-hints-color : @ol-blue-gray-4; +// Plans +@table-hover-bg : @ol-blue-gray-0; +@plans-non-highlighted : white; + // Portals @black-alpha-strong : rgba(0,0,0,0.8); @@ -360,6 +375,7 @@ @purple: #7a43b6; @brand-primary: @ol-green; +@brand-secondary: @ol-dark-green; @brand-success: @green; @brand-info: @ol-blue; @brand-warning: @orange; diff --git a/services/web/public/stylesheets/core/variables.less b/services/web/public/stylesheets/core/variables.less index 5fd9bfeddc..71fca59f4f 100755 --- a/services/web/public/stylesheets/core/variables.less +++ b/services/web/public/stylesheets/core/variables.less @@ -20,6 +20,7 @@ @purple: #7a43b6; @brand-primary: @red; +@brand-secondary: @red; @brand-success: @green; @brand-info: @blue; @brand-warning: @orange; diff --git a/services/web/public/stylesheets/ol-style.less b/services/web/public/stylesheets/ol-style.less index 0f99dab3f0..74cfe9ff22 100644 --- a/services/web/public/stylesheets/ol-style.less +++ b/services/web/public/stylesheets/ol-style.less @@ -8,6 +8,7 @@ @import "_ol_style_includes.less"; @import "components/embed-responsive.less"; @import "components/icons.less"; +@import "components/navs-ol.less"; @import "components/pagination.less"; @import "components/publish-modal.less"; @@ -15,4 +16,5 @@ @import "app/about.less"; @import "app/blog-posts.less"; @import "app/cms-page.less"; +@import "app/plans-ol.less"; @import "app/portals.less";