From 9cac0298a263ffd04872ee85f064bdaaae0513cf Mon Sep 17 00:00:00 2001 From: James Prado Date: Thu, 8 Mar 2018 14:28:43 -0500 Subject: [PATCH] Improve accessibility (a11y) (#1267) * Manage modal focus * Add isOpen prop to CustomNodeModal * Remove outline overrides * Update outline style for inputs * Fix modal focus management & Cleanup CustomNodeModal * Add aria-label on modal close button * Fix modal scroll to top * Add aria-live property for notifications * Add aria-busy to Spinner component * Fix border styles for generatewallet password inputs * Update token balances inputs * Remove multiple h1's & Update styles * Add alt text to all img elements * Update swap link from bity to shapeshift * Update aria-labels and alt text * Only show keystore password input when required * Revert "Only show keystore password input when required" This reverts commit 7ec5de52da0982cd3131f365b142f6915638d831. * address changes requested --- common/assets/styles/bootstrap/mixins.less | 59 ++-- .../assets/styles/bootstrap/mixins/forms.less | 9 +- .../styles/bootstrap/mixins/tab-focus.less | 6 - .../assets/styles/etherwallet-ext-custom.less | 4 - common/components/AmountField.tsx | 2 +- .../PromoComponents/Coinbase.tsx | 2 +- .../PromoComponents/HardwareWallets.tsx | 4 +- .../PromoComponents/Shapeshift.tsx | 2 +- common/components/BalanceSidebar/Promos.scss | 3 +- .../TokenBalances/AddCustomTokenForm.tsx | 4 +- .../BalanceSidebar/TokenBalances/TokenRow.tsx | 1 + common/components/BetaAgreement/index.scss | 5 +- .../GenerateKeystoreModal/index.tsx | 6 +- .../Header/components/CustomNodeModal.scss | 15 + .../Header/components/CustomNodeModal.tsx | 308 +++++++++--------- common/components/Header/index.tsx | 11 +- common/components/PaperWallet/index.tsx | 6 +- common/components/TogglablePassword.tsx | 15 +- .../WalletDecrypt/WalletDecrypt.scss | 6 +- .../components/WalletButton.scss | 2 - .../WalletDecrypt/components/WalletButton.tsx | 31 +- common/components/ui/ColorDropdown.tsx | 1 + common/components/ui/Help.tsx | 2 +- common/components/ui/Identicon.tsx | 1 + common/components/ui/Input.scss | 47 ++- common/components/ui/Modal.tsx | 149 --------- common/components/ui/Modal/ModalBody.tsx | 131 ++++++++ .../ui/{Modal.scss => Modal/index.scss} | 24 +- common/components/ui/Modal/index.tsx | 70 ++++ common/components/ui/OfflineSymbol.tsx | 2 +- common/components/ui/QRCode.tsx | 1 + common/components/ui/Spinner.tsx | 2 +- common/components/ui/SwapDropdown.scss | 3 - common/components/ui/SwapDropdown.tsx | 4 +- common/containers/OnboardModal/index.tsx | 10 +- .../containers/TabSection/Notifications.tsx | 2 +- .../Tabs/ENS/components/NameInput.tsx | 6 +- .../components/CryptoWarning.tsx | 6 +- .../components/Keystore/PaperWallet.scss | 13 +- .../components/Keystore/PaperWallet.tsx | 24 +- .../components/Mnemonic/Word.tsx | 4 +- .../GenerateWallet/components/Template.scss | 1 - .../Tabs/Swap/components/CurrencySwap.tsx | 4 +- .../Tabs/Swap/components/CurrentRates.tsx | 2 +- .../Swap/components/SwapInfoHeaderTitle.tsx | 6 +- common/sass/styles.scss | 5 + common/sass/styles/flexbox.scss | 13 + .../sass/styles/overrides/button-groups.scss | 6 - common/sass/styles/overrides/forms.scss | 1 - .../sass/styles/overrides/react-select.scss | 3 + 50 files changed, 570 insertions(+), 474 deletions(-) delete mode 100755 common/assets/styles/bootstrap/mixins/tab-focus.less create mode 100644 common/components/Header/components/CustomNodeModal.scss delete mode 100644 common/components/ui/Modal.tsx create mode 100644 common/components/ui/Modal/ModalBody.tsx rename common/components/ui/{Modal.scss => Modal/index.scss} (92%) create mode 100644 common/components/ui/Modal/index.tsx diff --git a/common/assets/styles/bootstrap/mixins.less b/common/assets/styles/bootstrap/mixins.less index 0cdf66e0..eeee4418 100755 --- a/common/assets/styles/bootstrap/mixins.less +++ b/common/assets/styles/bootstrap/mixins.less @@ -1,36 +1,35 @@ // Mixins // -------------------------------------------------- // Utilities -@import "mixins/hide-text.less"; -@import "mixins/opacity.less"; -@import "mixins/image.less"; -@import "mixins/labels.less"; -@import "mixins/reset-filter.less"; -@import "mixins/resize.less"; -@import "mixins/responsive-visibility.less"; -@import "mixins/size.less"; -@import "mixins/tab-focus.less"; -@import "mixins/reset-text.less"; -@import "mixins/text-emphasis.less"; -@import "mixins/text-overflow.less"; -@import "mixins/vendor-prefixes.less"; +@import 'mixins/hide-text.less'; +@import 'mixins/opacity.less'; +@import 'mixins/image.less'; +@import 'mixins/labels.less'; +@import 'mixins/reset-filter.less'; +@import 'mixins/resize.less'; +@import 'mixins/responsive-visibility.less'; +@import 'mixins/size.less'; +@import 'mixins/reset-text.less'; +@import 'mixins/text-emphasis.less'; +@import 'mixins/text-overflow.less'; +@import 'mixins/vendor-prefixes.less'; // Components -@import "mixins/alerts.less"; -@import "mixins/buttons.less"; -@import "mixins/panels.less"; -@import "mixins/pagination.less"; -@import "mixins/list-group.less"; -@import "mixins/nav-divider.less"; -@import "mixins/forms.less"; -@import "mixins/progress-bar.less"; -@import "mixins/table-row.less"; +@import 'mixins/alerts.less'; +@import 'mixins/buttons.less'; +@import 'mixins/panels.less'; +@import 'mixins/pagination.less'; +@import 'mixins/list-group.less'; +@import 'mixins/nav-divider.less'; +@import 'mixins/forms.less'; +@import 'mixins/progress-bar.less'; +@import 'mixins/table-row.less'; // Skins -@import "mixins/background-variant.less"; -@import "mixins/border-radius.less"; -@import "mixins/gradients.less"; +@import 'mixins/background-variant.less'; +@import 'mixins/border-radius.less'; +@import 'mixins/gradients.less'; // Layout -@import "mixins/clearfix.less"; -@import "mixins/center-block.less"; -@import "mixins/nav-vertical-align.less"; -@import "mixins/grid-framework.less"; -@import "mixins/grid.less"; +@import 'mixins/clearfix.less'; +@import 'mixins/center-block.less'; +@import 'mixins/nav-vertical-align.less'; +@import 'mixins/grid-framework.less'; +@import 'mixins/grid.less'; diff --git a/common/assets/styles/bootstrap/mixins/forms.less b/common/assets/styles/bootstrap/mixins/forms.less index c874b077..cde07d25 100755 --- a/common/assets/styles/bootstrap/mixins/forms.less +++ b/common/assets/styles/bootstrap/mixins/forms.less @@ -20,10 +20,10 @@ // Set the border and box shadow on specific inputs to match .form-control { border-color: @border-color; - .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075)); // Redeclare so transitions work + .box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.075)); // Redeclare so transitions work &:focus { border-color: darken(@border-color, 10%); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 3px rgba(@brand-primary, .5); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 3px rgba(@brand-primary, 0.5); } } // Set validation states also for addons @@ -51,11 +51,10 @@ // Example usage: change the default blue border and shadow to white for better // contrast against a dark gray background. .form-control-focus(@color: @input-border-focus) { - @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); + @color-rgba: rgba(red(@color), green(@color), blue(@color), 0.6); &:focus { border-color: @color; - outline: 0; - .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); + .box-shadow(~'inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}'); } } diff --git a/common/assets/styles/bootstrap/mixins/tab-focus.less b/common/assets/styles/bootstrap/mixins/tab-focus.less deleted file mode 100755 index d12b9b9f..00000000 --- a/common/assets/styles/bootstrap/mixins/tab-focus.less +++ /dev/null @@ -1,6 +0,0 @@ -// WebKit-style focus - -.tab-focus() { - outline: thin dotted; - outline-offset: 3px; -} diff --git a/common/assets/styles/etherwallet-ext-custom.less b/common/assets/styles/etherwallet-ext-custom.less index bf904a45..c4e5552d 100755 --- a/common/assets/styles/etherwallet-ext-custom.less +++ b/common/assets/styles/etherwallet-ext-custom.less @@ -7,10 +7,6 @@ position: absolute; left: 5px; top: 5px; - &:hover, - &:active { - outline: 0; - } } } diff --git a/common/components/AmountField.tsx b/common/components/AmountField.tsx index 3095835f..69cee947 100644 --- a/common/components/AmountField.tsx +++ b/common/components/AmountField.tsx @@ -18,7 +18,7 @@ export const AmountField: React.SFC = ({ (
-
- + Coinbase logo
diff --git a/common/components/BalanceSidebar/PromoComponents/HardwareWallets.tsx b/common/components/BalanceSidebar/PromoComponents/HardwareWallets.tsx index a9dd2440..a64446c3 100644 --- a/common/components/BalanceSidebar/PromoComponents/HardwareWallets.tsx +++ b/common/components/BalanceSidebar/PromoComponents/HardwareWallets.tsx @@ -11,8 +11,8 @@ export const HardwareWallets: React.SFC = () => (
Learn more about protecting your funds.
- - + Ledger Logo + Trezor Logo
diff --git a/common/components/BalanceSidebar/PromoComponents/Shapeshift.tsx b/common/components/BalanceSidebar/PromoComponents/Shapeshift.tsx index dca7b09b..1a5357e4 100644 --- a/common/components/BalanceSidebar/PromoComponents/Shapeshift.tsx +++ b/common/components/BalanceSidebar/PromoComponents/Shapeshift.tsx @@ -13,7 +13,7 @@ export const Shapeshift: React.SFC = () => (
- + Shapeshift Logo
diff --git a/common/components/BalanceSidebar/Promos.scss b/common/components/BalanceSidebar/Promos.scss index 505dda6c..8dab7958 100644 --- a/common/components/BalanceSidebar/Promos.scss +++ b/common/components/BalanceSidebar/Promos.scss @@ -85,7 +85,6 @@ height: 12px; border: 3px solid $gray-lightest; border-radius: 100%; - outline: none; opacity: 0.6; &.is-active { @@ -96,7 +95,7 @@ // Per-promo customizations &--shapeshift { - background-color: #263A52; + background-color: #263a52; .Promos-promo-images { max-width: 130px; diff --git a/common/components/BalanceSidebar/TokenBalances/AddCustomTokenForm.tsx b/common/components/BalanceSidebar/TokenBalances/AddCustomTokenForm.tsx index 29c4d742..294f12ea 100644 --- a/common/components/BalanceSidebar/TokenBalances/AddCustomTokenForm.tsx +++ b/common/components/BalanceSidebar/TokenBalances/AddCustomTokenForm.tsx @@ -66,11 +66,11 @@ export default class AddCustomTokenForm extends React.PureComponent { return (