From 4e4c740c2c1b7c9ff9f9b4ac37f2f81c08ccb869 Mon Sep 17 00:00:00 2001 From: Chris Rodriguez Date: Tue, 28 Jun 2016 08:32:38 -0400 Subject: [PATCH] AC-517 fixes `color-contrast` ignores across platform --- cms/static/sass/_base.scss | 25 +++------ cms/static/sass/_build-v1.scss | 4 ++ .../sass/elements/_codemirror-overrides.scss | 11 ++++ cms/static/sass/elements/_controls.scss | 52 ++++++++---------- cms/static/sass/elements/_footer.scss | 4 +- cms/static/sass/elements/_forms.scss | 2 +- cms/static/sass/elements/_header.scss | 13 +++-- cms/static/sass/elements/_layout.scss | 2 +- cms/static/sass/elements/_modules.scss | 14 ++--- cms/static/sass/elements/_pagination.scss | 4 +- cms/static/sass/elements/_sock.scss | 4 +- cms/static/sass/elements/_system-help.scss | 2 +- cms/static/sass/elements/_xblocks.scss | 2 +- cms/static/sass/partials/_variables.scss | 6 ++ cms/static/sass/views/_account.scss | 6 +- cms/static/sass/views/_certificates.scss | 10 ++-- cms/static/sass/views/_container.scss | 2 +- cms/static/sass/views/_dashboard.scss | 5 +- .../sass/views/_group-configuration.scss | 6 +- cms/static/sass/views/_settings.scss | 15 ++--- cms/static/sass/views/_textbooks.scss | 10 ++-- common/static/sass/_mixins-inherited.scss | 12 ++-- common/static/sass/_mixins.scss | 20 ++----- common/test/acceptance/tests/lms/test_lms.py | 6 +- .../lms/test_lms_instructor_dashboard.py | 5 +- .../tests/lms/test_problem_types.py | 2 - .../tests/studio/test_studio_library.py | 1 - .../tests/studio/test_studio_settings.py | 1 - .../tests/studio/test_studio_textbooks.py | 1 - .../cms/static/sass/partials/_variables.scss | 6 ++ .../views/certificate_bulk_whitelist.js | 2 +- .../views/certificate_whitelist.js | 6 +- .../certificates_exception_spec.js | 4 +- lms/static/sass/course/_textbook.scss | 4 +- .../sass/course/courseware/_courseware.scss | 23 ++++++-- .../sass/course/instructor/_instructor_2.scss | 39 +++++++------ .../course/layout/_courseware_header.scss | 14 ++--- lms/static/sass/partials/base/_variables.scss | 16 ++++-- .../certificate-bulk-white-list.underscore | 2 +- screenshots/baseline/hinted-login-firefox.png | Bin 14512 -> 14513 bytes 40 files changed, 187 insertions(+), 176 deletions(-) create mode 100644 cms/static/sass/elements/_codemirror-overrides.scss diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss index 3fd284bdeaee..a8dd687fb67d 100644 --- a/cms/static/sass/_base.scss +++ b/cms/static/sass/_base.scss @@ -44,10 +44,10 @@ body, input, button { a { @include transition(color $tmg-f2 ease-in-out 0s); text-decoration: none; - color: $blue; + color: $uxpl-blue-base; &:hover { - color: $orange-d1; + color: $uxpl-blue-hover-active; } } @@ -84,7 +84,7 @@ h1 { position: relative; top: ($baseline/4); display: block; - color: $gray-l2; + color: $gray-d2; } } @@ -293,14 +293,6 @@ p, ul, ol, dl { .button { padding: ($baseline/4) ($baseline/2) ($baseline/3) ($baseline/2); } - - .new-button { - - } - - .view-button { - - } } } @@ -452,11 +444,11 @@ p, ul, ol, dl { .tip { @extend %t-copy-sub2; + @include text-align(right); + @include float(right); width: flex-grid(7, 12); - float: right; margin-top: ($baseline/2); - text-align: right; - color: $gray-l2; + color: $gray-d1; } } } @@ -705,9 +697,10 @@ hr.divider { color: $white; } - &:hover { + &:hover, + &:active { top: 0; - background: $blue; + background: $uxpl-blue-base; } } diff --git a/cms/static/sass/_build-v1.scss b/cms/static/sass/_build-v1.scss index f6770f4b9b2f..36c86d4d3406 100644 --- a/cms/static/sass/_build-v1.scss +++ b/cms/static/sass/_build-v1.scss @@ -81,3 +81,7 @@ @import 'developer'; // used for any developer-created scss that needs further polish/refactoring @import 'shame'; // used for any bad-form/orphaned scss + +// +CodeMirror Overrides +// ==================== +@import 'elements/codemirror-overrides'; diff --git a/cms/static/sass/elements/_codemirror-overrides.scss b/cms/static/sass/elements/_codemirror-overrides.scss new file mode 100644 index 000000000000..1d09f2301973 --- /dev/null +++ b/cms/static/sass/elements/_codemirror-overrides.scss @@ -0,0 +1,11 @@ +/* + * CodeMirror color contrast overrides + * (so we don't change the vendor file) + */ + +.CodeMirror { + + .CodeMirror-linenumber.CodeMirror-gutter-elt { + color: $gray-d3 !important; + } +} diff --git a/cms/static/sass/elements/_controls.scss b/cms/static/sass/elements/_controls.scss index 57ce75625e19..6cc33dd6898c 100644 --- a/cms/static/sass/elements/_controls.scss +++ b/cms/static/sass/elements/_controls.scss @@ -62,22 +62,22 @@ // blue primary button %btn-primary-blue { @extend %ui-btn-primary; - background: $blue; - border-color: $blue-s1; + background: $uxpl-blue-base; + border-color: $uxpl-blue-base; color: $white; &:hover, &:active { - background: $blue-l1; - border-color: $blue-l1; + background: $uxpl-blue-hover-active; + border-color: $uxpl-blue-hover-active; } &.current, &.active { - background: $blue-d1; + background: $uxpl-blue-hover-active; + border-color: $uxpl-blue-hover-active; color: $blue-l4; - border-color: $blue-d2; &:hover, &:active { - background: $blue-d1; + background: $uxpl-blue-hover-active; } } } @@ -85,22 +85,22 @@ // green primary button %btn-primary-green { @extend %ui-btn-primary; - background: $green; - border-color: $green; + background: $uxpl-green-base; + border-color: $uxpl-green-base; color: $white; &:hover, &:active { - background: $green-s1; - border-color: $green-s1; + background: $uxpl-green-hover-active; + border-color: $uxpl-green-hover-active; } &.current, &.active { - background: $green-d1; - color: $green-l4; - border-color: $green-d2; + background: $uxpl-green-hover-active; + color: $white; + border-color: $uxpl-green-hover-active; &:hover, &:active { - background: $green-d1; + background: $uxpl-green-hover-active; } } } @@ -132,21 +132,17 @@ %btn-secondary-blue { @extend %ui-btn-secondary; border-color: $blue-l3; - color: $blue; + color: $uxpl-blue-base; &:hover, &:active { background: $blue-l4; - color: $blue-s2; + color: $uxpl-blue-hover-active; } &.current, &.active { border-color: $blue-l3; background: $blue-l3; - color: $blue-d1; - - &:hover, &:active { - - } + color: $uxpl-blue-base; } } @@ -235,7 +231,7 @@ &:hover, &:active { background: $white; - color: $blue-s1; + color: $uxpl-blue-hover-active; } &.current, &.active { @@ -243,7 +239,7 @@ color: $gray-d4; &:hover, &:active { - color: $blue-s1; + color: $uxpl-blue-hover-active; } } } @@ -268,7 +264,7 @@ color: $gray-l1; &:hover { - background-color: $blue; + background-color: $uxpl-blue-base; color: $gray-l6; } @@ -320,7 +316,7 @@ vertical-align: top; &:hover { - color: $blue; + color: $uxpl-blue-base; } .ui-toggle-expansion { @@ -358,7 +354,7 @@ // STATE: hover/active &:hover, &:active { @extend %ui-fake-link; - color: $ui-link-color-focus; + color: $uxpl-blue-base; } } @@ -404,7 +400,7 @@ position: absolute; top: -12px; left: -($baseline/4); - color: $blue-s1; + color: $blue-d1; } } diff --git a/cms/static/sass/elements/_footer.scss b/cms/static/sass/elements/_footer.scss index a95aed30aefb..76af72920ddb 100644 --- a/cms/static/sass/elements/_footer.scss +++ b/cms/static/sass/elements/_footer.scss @@ -27,10 +27,10 @@ } a { - color: $ui-link-color; + color: $uxpl-blue-base; &:hover, &:active { - color: $ui-link-color-focus; + color: $uxpl-blue-hover-active; } } diff --git a/cms/static/sass/elements/_forms.scss b/cms/static/sass/elements/_forms.scss index 7bec93b1adb9..5a9538660492 100644 --- a/cms/static/sass/elements/_forms.scss +++ b/cms/static/sass/elements/_forms.scss @@ -249,7 +249,7 @@ form { &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } diff --git a/cms/static/sass/elements/_header.scss b/cms/static/sass/elements/_header.scss index 386e30ee1482..146766c3934c 100644 --- a/cms/static/sass/elements/_header.scss +++ b/cms/static/sass/elements/_header.scss @@ -76,7 +76,7 @@ color: $gray-d1; &:hover { - color: $blue-s1; + color: $uxpl-blue-hover-active; } } } @@ -151,7 +151,8 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - opacity: 0.75; + opacity: 1.0; + color: $gray-d3; } .course-org { @@ -172,10 +173,10 @@ .course-link { @include transition(color $tmg-f2 ease-in-out 0s); display: block; - color: $gray-d1; + color: $gray-d3; &:hover { - color: $blue-s1; + color: $uxpl-blue-hover-active; } } } @@ -398,10 +399,10 @@ body.course.view-team .nav-library-settings .title, body.course.view-team .nav-library-settings-team, { - color: $blue; + color: $uxpl-blue-base; a { - color: $blue; + color: $uxpl-blue-base; pointer-events: none; } } diff --git a/cms/static/sass/elements/_layout.scss b/cms/static/sass/elements/_layout.scss index 095eec39bc85..f0cfdeaf928c 100644 --- a/cms/static/sass/elements/_layout.scss +++ b/cms/static/sass/elements/_layout.scss @@ -261,7 +261,7 @@ float: right; margin-top: ($baseline/2); text-align: right; - color: $gray-l2; + color: $gray-d1; } } } diff --git a/cms/static/sass/elements/_modules.scss b/cms/static/sass/elements/_modules.scss index 06bb1fe45dcd..33805dec34a0 100644 --- a/cms/static/sass/elements/_modules.scss +++ b/cms/static/sass/elements/_modules.scss @@ -26,13 +26,13 @@ @extend %t-title8; @extend %t-strong; margin-bottom: ($baseline/4); - color: $gray-l2; + color: $gray-d2; text-transform: uppercase; } .meta { @extend %t-copy-sub2; - color: $gray-l1; + color: $gray-d2; } } } @@ -110,7 +110,7 @@ @extend %t-title5; @extend %t-strong; margin-bottom: ($baseline*0.75); - color: $green-d1; + color: $uxpl-green-base; } // add component - list of green buttons @@ -131,16 +131,10 @@ height: ($baseline*5); margin-bottom: ($baseline/2); box-shadow: 0 1px 1px $shadow, 0 1px 0 rgba(255, 255, 255, .4) inset; - border: 1px solid $green-d2; border-radius: ($baseline/4); padding: 0; - background-color: $green-l1; text-align: center; - color: $white; - - &:hover { - background: $green-s1; - } + @extend %btn-primary-green; .name { @include box-sizing(border-box); diff --git a/cms/static/sass/elements/_pagination.scss b/cms/static/sass/elements/_pagination.scss index 902f7c410a93..c7e7e67cc72e 100644 --- a/cms/static/sass/elements/_pagination.scss +++ b/cms/static/sass/elements/_pagination.scss @@ -69,7 +69,7 @@ margin: 0 ($baseline*0.75); padding: ($baseline/4); text-align: center; - color: $gray; + color: $gray-d2; } .current-page { @@ -82,7 +82,7 @@ @extend %t-title4; @extend %t-regular; vertical-align: middle; - color: $gray-l2; + color: $gray; } .pagination-form { diff --git a/cms/static/sass/elements/_sock.scss b/cms/static/sass/elements/_sock.scss index 4ed0e06f6973..3c96fa328a09 100644 --- a/cms/static/sass/elements/_sock.scss +++ b/cms/static/sass/elements/_sock.scss @@ -31,7 +31,7 @@ @extend %t-action4; background: $gray-l5; padding: ($baseline/2) $baseline; - color: $gray; + color: $gray-d2; .icon { @extend %t-icon6; @@ -39,7 +39,7 @@ } &:hover { - background: $blue; + background: $uxpl-blue-base; color: $white; } } diff --git a/cms/static/sass/elements/_system-help.scss b/cms/static/sass/elements/_system-help.scss index 1bb350f4fe83..5fc64575cad2 100644 --- a/cms/static/sass/elements/_system-help.scss +++ b/cms/static/sass/elements/_system-help.scss @@ -220,7 +220,7 @@ margin: 0 0 $baseline 0; border-bottom: 1px solid $gray-l4; padding: 0 0 $baseline 0; - color: $gray-l1; + color: $gray-d1; &:last-child { margin-bottom: 0; diff --git a/cms/static/sass/elements/_xblocks.scss b/cms/static/sass/elements/_xblocks.scss index bcea673d8a65..61940d0b71c8 100644 --- a/cms/static/sass/elements/_xblocks.scss +++ b/cms/static/sass/elements/_xblocks.scss @@ -167,7 +167,7 @@ display: inline-block; vertical-align: top; width: flex-grid(9, 12); - color: $gray-l1; + color: $gray-d1; .count-current-shown, .count-total, diff --git a/cms/static/sass/partials/_variables.scss b/cms/static/sass/partials/_variables.scss index fa9c3159d03d..4e9f1dac9db7 100644 --- a/cms/static/sass/partials/_variables.scss +++ b/cms/static/sass/partials/_variables.scss @@ -87,6 +87,12 @@ $blue-t1: rgba($blue, 0.25); $blue-t2: rgba($blue, 0.50); $blue-t3: rgba($blue, 0.75); +$uxpl-blue-base: rgba(0, 116, 180, 1); // wcag2a compliant +$uxpl-blue-hover-active: lighten($uxpl-blue-base, 7%); // wcag2a compliant + +$uxpl-green-base: rgba(0, 129, 0, 1); // wcag2a compliant +$uxpl-green-hover-active: lighten($uxpl-green-base, 7%); // wcag2a compliant + $pink: rgb(183, 37, 103); // #b72567; $pink-l1: tint($pink,20%); $pink-l2: tint($pink,40%); diff --git a/cms/static/sass/views/_account.scss b/cms/static/sass/views/_account.scss index 2c5da78093aa..48e2ea798640 100644 --- a/cms/static/sass/views/_account.scss +++ b/cms/static/sass/views/_account.scss @@ -148,7 +148,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } @@ -173,7 +173,7 @@ @include transition(color $tmg-f3 ease-in-out 0s); display: block; margin-top: ($baseline/4); - color: $gray-l3; + color: $gray-d1; } } @@ -214,7 +214,7 @@ margin: 0 0 $baseline 0; border-bottom: 1px solid $gray-l4; padding: 0 0 $baseline 0; - color: $gray-l1; + color: $gray-d1; &:last-child { margin-bottom: 0; diff --git a/cms/static/sass/views/_certificates.scss b/cms/static/sass/views/_certificates.scss index d7f709ab5f96..5349aa472566 100644 --- a/cms/static/sass/views/_certificates.scss +++ b/cms/static/sass/views/_certificates.scss @@ -242,11 +242,11 @@ @include transition(color, 0.15s, ease-in-out); display: block; margin-top: ($baseline/2); - color: $gray-l2; + color: $gray-d1; } .is-focused .tip { - color: $gray; + color: $gray-d2; } @@ -325,7 +325,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d2; } } } @@ -588,7 +588,7 @@ @include transition(color, 0.15s, ease-in-out); display: block; margin-top: ($baseline/4); - color: $gray-l3; + color: $gray-d1; } .field { @@ -661,7 +661,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } diff --git a/cms/static/sass/views/_container.scss b/cms/static/sass/views/_container.scss index 999a19ccaa86..3c26cf1a0b50 100644 --- a/cms/static/sass/views/_container.scss +++ b/cms/static/sass/views/_container.scss @@ -277,7 +277,7 @@ @extend %t-copy-sub2; display: inline-block; margin: ($baseline/4) 0; - color: $gray-l2; + color: $gray-d1; } } diff --git a/cms/static/sass/views/_dashboard.scss b/cms/static/sass/views/_dashboard.scss index 42de626249c6..a1614a9dc3a4 100644 --- a/cms/static/sass/views/_dashboard.scss +++ b/cms/static/sass/views/_dashboard.scss @@ -300,7 +300,7 @@ margin: 0 10px; &.active { - border-bottom: 4px solid $blue; + border-bottom: 4px solid $uxpl-blue-base; } &.active, &:hover { @@ -310,7 +310,7 @@ } a { - color: $blue; + color: $uxpl-blue-base; cursor: pointer; display: inline-block; } @@ -492,7 +492,6 @@ @extend %t-copy-sub1; @include transition(opacity $tmg-f1 ease-in-out 0); color: $gray; - opacity: 0.75; .metadata-item { display: inline-block; diff --git a/cms/static/sass/views/_group-configuration.scss b/cms/static/sass/views/_group-configuration.scss index 897860a7c646..ae31c8c56e3e 100644 --- a/cms/static/sass/views/_group-configuration.scss +++ b/cms/static/sass/views/_group-configuration.scss @@ -269,11 +269,11 @@ @include transition(color, 0.15s, ease-in-out); display: block; margin-top: ($baseline/4); - color: $gray-l3; + color: $gray-d1; } .is-focused .tip { - color: $gray; + color: $gray-d2; } @@ -352,7 +352,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } diff --git a/cms/static/sass/views/_settings.scss b/cms/static/sass/views/_settings.scss index ae46150d30f4..fe063fe1f6ed 100644 --- a/cms/static/sass/views/_settings.scss +++ b/cms/static/sass/views/_settings.scss @@ -104,7 +104,7 @@ @include float(right); margin-top: ($baseline/2); @include text-align(right); - color: $gray-l2; + color: $gray-d1; } } @@ -219,7 +219,7 @@ margin: 0 0 ($baseline/4) 0; &.is-focused { - color: $blue; + color: $uxpl-blue-base; } } @@ -242,7 +242,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } @@ -398,9 +398,10 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + color: $uxpl-blue-base; &:hover { - + color: $uxpl-blue-hover-active; } } } @@ -546,7 +547,7 @@ @extend %t-copy-sub2; display: block; margin-top: ($baseline/2); - color: $gray-l3; + color: $gray-d3; } } @@ -562,7 +563,7 @@ .action-upload-image { @extend %ui-btn-flat-outline; - float: right; + @include float(right); width: flex-grid(2,9); margin-top: ($baseline/4); padding: ($baseline/2) $baseline; @@ -1039,7 +1040,7 @@ } .tip { - color: $gray-l1; + color: $gray-d1; } input.error { diff --git a/cms/static/sass/views/_textbooks.scss b/cms/static/sass/views/_textbooks.scss index 1e8ca56c7cc2..b8d177d62075 100644 --- a/cms/static/sass/views/_textbooks.scss +++ b/cms/static/sass/views/_textbooks.scss @@ -44,10 +44,10 @@ @extend %ui-fake-link; &:hover { - color: $blue; + color: $uxpl-blue-base; .ui-toggle-expansion { - color: $blue; + color: $uxpl-blue-base; } } } @@ -212,7 +212,7 @@ margin: 0 0 ($baseline/4) 0; &.is-focused { - color: $blue; + color: $uxpl-blue-base; } } @@ -256,7 +256,7 @@ &:focus { + .tip { - color: $gray; + color: $gray-d1; } } } @@ -281,7 +281,7 @@ @include transition(color, 0.15s, ease-in-out); display: block; margin-top: ($baseline/4); - color: $gray-l3; + color: $gray-d1; } &.error { diff --git a/common/static/sass/_mixins-inherited.scss b/common/static/sass/_mixins-inherited.scss index b26def49e22b..538110dac595 100644 --- a/common/static/sass/_mixins-inherited.scss +++ b/common/static/sass/_mixins-inherited.scss @@ -147,13 +147,13 @@ @include button; @include linear-gradient(top, rgba(255, 255, 255, .3), rgba(255, 255, 255, 0)); box-shadow: 0 1px 0 rgba(255, 255, 255, .3) inset; - border: 1px solid $green-d1; + border: 1px solid $uxpl-green-base; border-radius: 3px; - background-color: $green; + background-color: $uxpl-green-base; color: $white; &:hover, &:focus { - background-color: $green-s1; + background-color: $uxpl-green-hover-active; color: $white; } @@ -168,13 +168,13 @@ @mixin blue-button { @include button; @include linear-gradient(top, rgba(255, 255, 255, .3), rgba(255, 255, 255, 0)); - border: 1px solid $blue-d1; + border: 1px solid $uxpl-blue-base; border-radius: 3px; - background-color: $blue; + background-color: $uxpl-blue-base; color: $white; &:hover, &:focus, &:active { - background-color: $blue-s2; + background-color: $uxpl-blue-hover-active; color: $white; } diff --git a/common/static/sass/_mixins.scss b/common/static/sass/_mixins.scss index ef8a09897463..89dca29d3f76 100644 --- a/common/static/sass/_mixins.scss +++ b/common/static/sass/_mixins.scss @@ -261,14 +261,6 @@ background: transparent; line-height: 1.5em; text-align: center; - - &:hover, &:active, &:focus { - - } - - &.current, &.active { - - } } %ui-btn-flat-outline { @@ -277,14 +269,14 @@ @extend %t-action4; text-align: center; border-radius: ($baseline/4); - border: 1px solid $blue-l2; + border: 1px solid $uxpl-blue-base; padding: 1px ($baseline/2) 2px ($baseline/2); - background-color: transparent; - color: $blue-l2; + background-color: $white; + color: $uxpl-blue-base; &:hover, &:focus { - border: 1px solid $blue; - background-color: $blue; + border: 1px solid $uxpl-blue-hover-active; + background-color: $uxpl-blue-hover-active; color: $white; } @@ -320,7 +312,7 @@ @extend %ui-btn-non; &:hover, &:focus { - background-color: $blue; + background-color: $uxpl-blue-base; color: $white; } } diff --git a/common/test/acceptance/tests/lms/test_lms.py b/common/test/acceptance/tests/lms/test_lms.py index fa62036db90c..6d27e03506df 100644 --- a/common/test/acceptance/tests/lms/test_lms.py +++ b/common/test/acceptance/tests/lms/test_lms.py @@ -169,7 +169,7 @@ def test_third_party_login(self): # Navigate to the login page self.login_page.visit() # Baseline screen-shots are different for chrome and firefox. - self.assertScreenshot('#login .login-providers', 'login-providers-{}'.format(self.browser.name)) + self.assertScreenshot('#login .login-providers', 'login-providers-{}'.format(self.browser.name), .25) # Try to log in using "Dummy" provider self.login_page.click_third_party_dummy_provider() @@ -217,7 +217,7 @@ def test_hinted_login(self): ) # Baseline screen-shots are different for chrome and firefox. - self.assertScreenshot('#hinted-login-form', 'hinted-login-{}'.format(self.browser.name)) + self.assertScreenshot('#hinted-login-form', 'hinted-login-{}'.format(self.browser.name), .25) self.login_page.click_third_party_dummy_provider() # We should now be redirected to the course page @@ -354,7 +354,7 @@ def test_third_party_register(self): # Navigate to the register page self.register_page.visit() # Baseline screen-shots are different for chrome and firefox. - self.assertScreenshot('#register .login-providers', 'register-providers-{}'.format(self.browser.name)) + self.assertScreenshot('#register .login-providers', 'register-providers-{}'.format(self.browser.name), .25) # Try to authenticate using the "Dummy" provider self.register_page.click_third_party_dummy_provider() diff --git a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py index adaad82053e2..80ba3813279c 100644 --- a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py +++ b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py @@ -95,8 +95,7 @@ def test_bulk_email_a11y(self): ]) self.send_email_page.a11y_audit.config.set_rules({ "ignore": [ - 'button-name', # TinyMCE button is missing accessible text - 'color-contrast', # TODO: AC-491 + 'button-name', # TODO: AC-491 ] }) self.send_email_page.a11y_audit.check_for_accessibility_errors() @@ -1053,7 +1052,6 @@ def test_certificates_a11y(self): "ignore": [ 'aria-valid-attr-value', # TODO: AC-491 'checkboxgroup', # TODO: AC-491 - 'color-contrast', # TODO: AC-491 'duplicate-id', # TODO: AC-491 'label', # TODO: AC-491 'radiogroup', # TODO: AC-491 @@ -1272,7 +1270,6 @@ def test_invalidate_certificates_a11y(self): "ignore": [ 'aria-valid-attr-value', # TODO: AC-491 'checkboxgroup', # TODO: AC-491 - 'color-contrast', # TODO: AC-491 'duplicate-id', # TODO: AC-491 'label', # TODO: AC-491 'radiogroup', # TODO: AC-491 diff --git a/common/test/acceptance/tests/lms/test_problem_types.py b/common/test/acceptance/tests/lms/test_problem_types.py index 44cc05c6ff92..0654d3e5d69d 100644 --- a/common/test/acceptance/tests/lms/test_problem_types.py +++ b/common/test/acceptance/tests/lms/test_problem_types.py @@ -252,7 +252,6 @@ def test_problem_type_a11y(self): 'aria-roles', # TODO: AC-491 'checkboxgroup', # TODO: AC-491 'radiogroup', # TODO: AC-491 - 'color-contrast', # TODO: AC-491 'section', # TODO: AC-491 'label', # TODO: AC-491 ] @@ -694,7 +693,6 @@ def setUp(self, *args, **kwargs): self.problem_page.a11y_audit.config.set_rules({ 'ignore': [ 'section', # TODO: AC-491 - 'color-contrast', # TODO: AC-286 'label', # TODO: AC-286 ] }) diff --git a/common/test/acceptance/tests/studio/test_studio_library.py b/common/test/acceptance/tests/studio/test_studio_library.py index 8dd0394c14e7..95462473ca50 100644 --- a/common/test/acceptance/tests/studio/test_studio_library.py +++ b/common/test/acceptance/tests/studio/test_studio_library.py @@ -656,7 +656,6 @@ def test_lib_edit_page_a11y(self): # we will ignore this error in the test until we fix them. lib_page.a11y_audit.config.set_rules({ "ignore": [ - 'color-contrast', # TODO: AC-225 'link-href', # TODO: AC-226 'nav-aria-label', # TODO: AC-227 'icon-aria-hidden', # TODO: AC-229 diff --git a/common/test/acceptance/tests/studio/test_studio_settings.py b/common/test/acceptance/tests/studio/test_studio_settings.py index 795408dccfa4..d5df239a4537 100644 --- a/common/test/acceptance/tests/studio/test_studio_settings.py +++ b/common/test/acceptance/tests/studio/test_studio_settings.py @@ -503,7 +503,6 @@ def test_studio_settings_page_a11y(self): # we will ignore this error in the test until we fix them. self.settings_page.a11y_audit.config.set_rules({ "ignore": [ - 'color-contrast', # TODO: AC-225 'link-href', # TODO: AC-226 'nav-aria-label', # TODO: AC-227 'icon-aria-hidden', # TODO: AC-229 diff --git a/common/test/acceptance/tests/studio/test_studio_textbooks.py b/common/test/acceptance/tests/studio/test_studio_textbooks.py index 87c9cb3d60d4..9c902002820c 100644 --- a/common/test/acceptance/tests/studio/test_studio_textbooks.py +++ b/common/test/acceptance/tests/studio/test_studio_textbooks.py @@ -60,7 +60,6 @@ def test_textbook_page_a11y(self): self.textbook_view_page.a11y_audit.config.set_rules({ 'ignore': [ - 'color-contrast', # AC-500 'skip-link', # AC-501 'link-href', # AC-502 'section' # AC-503 diff --git a/common/test/test-theme/cms/static/sass/partials/_variables.scss b/common/test/test-theme/cms/static/sass/partials/_variables.scss index 4265a16fec0a..33769e704a36 100644 --- a/common/test/test-theme/cms/static/sass/partials/_variables.scss +++ b/common/test/test-theme/cms/static/sass/partials/_variables.scss @@ -87,6 +87,12 @@ $blue-t1: rgba($blue, 0.25); $blue-t2: rgba($blue, 0.50); $blue-t3: rgba($blue, 0.75); +$uxpl-blue-base: rgba(0, 116, 180, 1); // wcag2a compliant +$uxpl-blue-hover-active: lighten($uxpl-blue-base, 7%); // wcag2a compliant + +$uxpl-green-base: rgba(0, 129, 0, 1); // wcag2a compliant +$uxpl-green-hover-active: lighten($uxpl-green-base, 7%); // wcag2a compliant + $pink: rgb(183, 37, 103); // #b72567; $pink-l1: tint($pink,20%); $pink-l2: tint($pink,40%); diff --git a/lms/static/js/certificates/views/certificate_bulk_whitelist.js b/lms/static/js/certificates/views/certificate_bulk_whitelist.js index 9b71832ba38f..31f22753c9b4 100644 --- a/lms/static/js/certificates/views/certificate_bulk_whitelist.js +++ b/lms/static/js/certificates/views/certificate_bulk_whitelist.js @@ -206,7 +206,7 @@ chooseFile: function(event) { if (event && event.preventDefault) { event.preventDefault(); } if (event.currentTarget.files.length === 1) { - this.$el.find(DOM_SELECTORS.upload_csv_button).removeClass('disabled'); + this.$el.find(DOM_SELECTORS.upload_csv_button).attr('disabled', 'false'); this.$el.find(DOM_SELECTORS.browse_file).val( event.currentTarget.value.substring(event.currentTarget.value.lastIndexOf("\\") + 1)); } diff --git a/lms/static/js/certificates/views/certificate_whitelist.js b/lms/static/js/certificates/views/certificate_whitelist.js index 101196994e93..66594c87b472 100644 --- a/lms/static/js/certificates/views/certificate_whitelist.js +++ b/lms/static/js/certificates/views/certificate_whitelist.js @@ -34,10 +34,10 @@ var template = this.loadTemplate('certificate-white-list'); this.$el.html(template({certificates: this.collection.models})); if (!this.active_certificate || this.collection.isEmpty()){ - this.$("#generate-exception-certificates").addClass("is-disabled"); + this.$("#generate-exception-certificates").attr("disabled", "disabled"); } else { - this.$("#generate-exception-certificates").removeClass("is-disabled"); + this.$("#generate-exception-certificates").removeAttr("disabled"); } }, @@ -107,4 +107,4 @@ }); } ); -}).call(this, define || RequireJS.define); \ No newline at end of file +}).call(this, define || RequireJS.define); diff --git a/lms/static/js/spec/instructor_dashboard/certificates_exception_spec.js b/lms/static/js/spec/instructor_dashboard/certificates_exception_spec.js index 2611b7cf0e88..a6e961d7f3f3 100644 --- a/lms/static/js/spec/instructor_dashboard/certificates_exception_spec.js +++ b/lms/static/js/spec/instructor_dashboard/certificates_exception_spec.js @@ -204,7 +204,7 @@ define([ it("verifies that Generate Exception Certificate button is disabled", function() { expect(view.$el.find('table tbody tr').length).toBe(2); - expect(view.$el.find('#generate-exception-certificates').first()).not.toHaveClass('is-disabled'); + expect(view.$el.find('#generate-exception-certificates').first()).not.toHaveAttr('disabled'); // Render the view with active_certificate set to false. view = new CertificateWhiteListView({ @@ -214,7 +214,7 @@ define([ view.render(); // Verify that `Generate Exception Certificate` is disabled even when Collection is not empty. - expect(view.$el.find('#generate-exception-certificates').first()).toHaveClass('is-disabled'); + expect(view.$el.find('#generate-exception-certificates').first()).toHaveAttr('disabled', 'disabled'); expect(view.$el.find('table tbody tr').length).toBe(2); }); diff --git a/lms/static/sass/course/_textbook.scss b/lms/static/sass/course/_textbook.scss index b624f8d67820..d4eb81ddcd38 100755 --- a/lms/static/sass/course/_textbook.scss +++ b/lms/static/sass/course/_textbook.scss @@ -53,11 +53,11 @@ div.book-wrapper { a { @include clearfix(); padding: 0; - color: $link-color; + color: $uxpl-blue-base; &:hover, &:focus { background-color: transparent; - color: $link-hover; + color: $uxpl-blue-hover-active; .page-number { opacity: 1.0; diff --git a/lms/static/sass/course/courseware/_courseware.scss b/lms/static/sass/course/courseware/_courseware.scss index 220aa301fa45..7cf7a43a9421 100644 --- a/lms/static/sass/course/courseware/_courseware.scss +++ b/lms/static/sass/course/courseware/_courseware.scss @@ -75,7 +75,7 @@ html.video-fullscreen { color: $gray; } a:active, a:hover { - color: $link-hover; + color: $uxpl-blue-base; } .license-label, @@ -151,7 +151,7 @@ html.video-fullscreen { } button.gated-sequence { background: $transparent; - color: $blue-d1; + color: $uxpl-blue-base; border: none; box-shadow: none; @include text-align(left); @@ -160,7 +160,7 @@ html.video-fullscreen { &:hover { background-color: transparent; - color: $link-hover; + color: $uxpl-blue-hover-active; } } @@ -169,12 +169,12 @@ html.video-fullscreen { font-size: 1.3em; } .gated-sequence { - color: #147ABA; + color: $uxpl-blue-base; font-weight: 600; padding: ($baseline / 1.5) ($baseline / 4); a.start-timed-exam { cursor: pointer; - color: #147ABA; + color: $uxpl-blue-base; font-weight: 600; position: relative; top: ($baseline/10); @@ -306,7 +306,7 @@ html.video-fullscreen { } &:last-child { > .practice-exam { - color: #147ABA; + color: $uxpl-blue-base; } border-bottom: none; } @@ -663,3 +663,14 @@ section.self-assessment { } +/* + * CodeMirror color contrast overrides + * (so we don't change the vendor file) + */ + +.CodeMirror { + + .CodeMirror-linenumber.CodeMirror-gutter-elt { + color: $gray-d3 !important; + } +} diff --git a/lms/static/sass/course/instructor/_instructor_2.scss b/lms/static/sass/course/instructor/_instructor_2.scss index 5260176c79c6..ab6550caabd8 100644 --- a/lms/static/sass/course/instructor/_instructor_2.scss +++ b/lms/static/sass/course/instructor/_instructor_2.scss @@ -33,7 +33,7 @@ .file-download-link a { font-size: 15px; - color: $link-color; + color: $uxpl-blue-base; text-decoration: underline; padding: ($baseline/4); } @@ -674,7 +674,7 @@ // .add-field input[type="button"].add { - @include idashbutton($blue); + @include idashbutton($uxpl-blue-base); position: absolute; @include right($baseline); } @@ -756,7 +756,7 @@ } } .form-submit { - @include idashbutton($blue); + @include idashbutton($uxpl-blue-base); @include font-size(14); @include line-height(14); margin-right: ($baseline/2); @@ -778,7 +778,7 @@ } .action-create { - @include idashbutton($blue); + @include idashbutton($uxpl-blue-base); @extend %t-weight4; @include float(right); @include text-align(right); @@ -803,7 +803,7 @@ // specific message actions .message .action-create { - @include idashbutton($blue); + @include idashbutton($uxpl-blue-base); } } @@ -979,7 +979,7 @@ } .action-submit { - @include idashbutton($blue); + @include idashbutton($uxpl-blue-base); // needed to override very poor specificity and base rules for blue button @include font-size(14); margin-bottom: 0; @@ -1126,7 +1126,7 @@ } .cohorted-text { - color: $link-color; + color: $uxpl-blue-base; } .discussions-wrapper { @@ -1427,7 +1427,7 @@ input[name="subject"] { color: #3c3c3c; line-height: 30px; .add{ - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; font-size: em(13); @include float(right); @@ -1632,7 +1632,7 @@ input[name="subject"] { border-radius: 2px; input[type="button"]#update_coupon_button, input[type="button"]#add_coupon_button, input[type="button"]#set_course_button, input[type="button"]#lookup_regcode { - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; display: block; height: auto; @@ -1641,7 +1641,7 @@ input[name="subject"] { white-space: normal; } input[name="generate-registration-codes-csv"]{ - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; } .modal-form-error { @@ -1782,7 +1782,7 @@ input[name="subject"] { h2 { font-size: 24px; font-weight: 100; - color: #1580b0; + color: $uxpl-blue-base; @include text-align(left); } } @@ -1906,7 +1906,7 @@ input[name="subject"] { color: #3c3c3c; line-height: 30px; .add{ - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; font-size: em(13); @include float(right); @@ -1925,7 +1925,7 @@ input[name="subject"] { color: #3C3C3C; line-height: 30px; .add{ - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; font-size: em(13); } @@ -1948,7 +1948,7 @@ input[name="subject"] { color: #3C3C3C; line-height: 30px; .add{ - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @extend .button-reset; font-size: em(13); } @@ -2135,8 +2135,8 @@ input[name="subject"] { &:focus { z-index: 2; color: #fff; - background-color: darken(#428bca, 6.5%); - border-color: darken(#428bca, 6.5%); + background-color: $uxpl-blue-base; + border-color: $uxpl-blue-base; cursor: default; } } @@ -2302,7 +2302,7 @@ input[name="subject"] { color: $gray-d1; &:hover { - color: $blue; + color: $uxpl-blue-hover-active; } } @@ -2361,21 +2361,20 @@ input[name="subject"] { display: inline; @include margin-left(-5px); span.browse { - @include button(simple, $blue); + @include button(simple, $uxpl-blue-base); @include margin-right($baseline); padding: 6px ($baseline/2); font-size: 12px; border-radius: 0 3px 3px 0; } input.file_field { + @extend %cont-text-sr; position: absolute; @include right(0); top: 0; margin: 0; padding: 0; cursor: pointer; - opacity: 0; - filter: alpha(opacity=0); } } & > span, & input[disabled] { diff --git a/lms/static/sass/course/layout/_courseware_header.scss b/lms/static/sass/course/layout/_courseware_header.scss index b2fbd68c197d..cd7d02c58370 100644 --- a/lms/static/sass/course/layout/_courseware_header.scss +++ b/lms/static/sass/course/layout/_courseware_header.scss @@ -44,18 +44,18 @@ &:hover, &:focus { - color: $blue; - border-bottom: 4px solid $blue; + color: $uxpl-blue-hover-active; + border-bottom: 4px solid $uxpl-blue-hover-active; } &.active { - border-bottom: 4px solid $blue; + border-bottom: 4px solid $uxpl-blue-base; background-color: transparent; - color: $blue; + color: $uxpl-blue-base; &:hover, &:focus { - color: $blue; + color: $uxpl-blue-base; } } } @@ -97,7 +97,7 @@ display: block; @include background-image(linear-gradient(-90deg, lighten($link-color, 8%), lighten($link-color, 5%) 50%, $link-color 50%, darken($link-color, 10%) 100%)); border: 1px solid transparent; - border-color: darken($link-color, 10%); + border-color: $uxpl-blue-base; border-radius: 3px; @include box-sizing(border-box); box-shadow: 0 1px 0 0 rgba(255,255,255, 0.6); @@ -117,7 +117,7 @@ vertical-align: middle; &:hover, &:active, &:focus { - @include background-image(linear-gradient(-90deg, $link-color, $link-color 50%, $link-color 50%, $link-color 100%)); + @include background-image(linear-gradient(-90deg, $uxpl-blue-base, $uxpl-blue-base 50%, $uxpl-blue-base 50%, $uxpl-blue-base 100%)); } } } diff --git a/lms/static/sass/partials/base/_variables.scss b/lms/static/sass/partials/base/_variables.scss index 36ff69b2f4fc..35eed076ccaf 100644 --- a/lms/static/sass/partials/base/_variables.scss +++ b/lms/static/sass/partials/base/_variables.scss @@ -159,6 +159,12 @@ $blue-t1: rgba($blue, 0.25); $blue-t2: rgba($blue, 0.50); $blue-t3: rgba($blue, 0.75); +$uxpl-blue-base: rgba(0, 116, 180, 1); // wcag2a compliant +$uxpl-blue-hover-active: lighten($uxpl-blue-base, 7%); // wcag2a compliant + +$uxpl-green-base: rgba(0, 129, 0, 1); // wcag2a compliant +$uxpl-green-hover-active: lighten($uxpl-green-base, 7%); // wcag2a compliant + $orange: rgb(237, 189, 60); $orange-l1: tint($orange,20%); $orange-l2: tint($orange,40%); @@ -423,11 +429,11 @@ $action-secondary-disabled-bg: $m-gray-d3 !default; $action-secondary-disabled-fg: $white !default; // actions - misc -$link-color: $blue !default; -$link-color-d1: $blue !default; -$link-hover: $blue-l1 !default; // from our Pattern Library http://ux.edx.org/elements/colors/ +$link-color: $uxpl-blue-base !default; +$link-color-d1: $link-color !default; +$link-hover: $uxpl-blue-hover-active !default; // from our Pattern Library http://ux.edx.org/elements/colors/ $site-status-color: $pink !default; -$button-color: $blue !default; +$button-color: $uxpl-blue-base !default; $button-archive-color: rgb(238,238,238) !default; // #eeeeee // larger, random elements @@ -462,7 +468,7 @@ $courseware-footer-margin: 0px !default; $courseware-border-bottom-color: rgb(68,162,222) !default; $courseware-button-border-color: rgb(230,230,230) !default; $courseware-hover-color: rgb(51,52,53) !default; -$courseware-navigation-color: $blue !default; +$courseware-navigation-color: $uxpl-blue-base !default; // homepage, onboarding, and course discovery $homepage__header--gradient__color--alpha: lighten($gray, 15%) !default; diff --git a/lms/templates/instructor/instructor_dashboard_2/certificate-bulk-white-list.underscore b/lms/templates/instructor/instructor_dashboard_2/certificate-bulk-white-list.underscore index 6283cf652713..462f7a05017b 100644 --- a/lms/templates/instructor/instructor_dashboard_2/certificate-bulk-white-list.underscore +++ b/lms/templates/instructor/instructor_dashboard_2/certificate-bulk-white-list.underscore @@ -11,7 +11,7 @@ -
+
diff --git a/screenshots/baseline/hinted-login-firefox.png b/screenshots/baseline/hinted-login-firefox.png index dad617e3be05e911ebd8b60f9559be4a9e224bd5..82be26134c7e548f804da6a15429320f00dd2fac 100644 GIT binary patch literal 14513 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 YGPCS*da=A};NB29DP>rpq{*lM4GA0Vv;Y7A literal 14512 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 E0H-L~U;qFB