diff --git a/apps/web/res/css/views/elements/_AccessibleButton.pcss b/apps/web/res/css/views/elements/_AccessibleButton.pcss index fafe75c642..3374935904 100644 --- a/apps/web/res/css/views/elements/_AccessibleButton.pcss +++ b/apps/web/res/css/views/elements/_AccessibleButton.pcss @@ -9,6 +9,11 @@ Please see LICENSE files in the repository root for full details. .mx_AccessibleButton { cursor: pointer; + button& { + /* Clear default button styling */ + all: unset; + } + &.mx_AccessibleButton_disabled { cursor: not-allowed; diff --git a/apps/web/res/css/views/elements/_CopyableText.pcss b/apps/web/res/css/views/elements/_CopyableText.pcss index 6219055085..e5cf1c51da 100644 --- a/apps/web/res/css/views/elements/_CopyableText.pcss +++ b/apps/web/res/css/views/elements/_CopyableText.pcss @@ -28,7 +28,6 @@ Please see LICENSE files in the repository root for full details. /* using em here to adapt to the local font size */ width: 1em; height: 1em; - cursor: pointer; padding-left: 12px; padding-right: 10px; display: block; diff --git a/apps/web/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/apps/web/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 49443bdd2e..edd44019ba 100644 --- a/apps/web/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/apps/web/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -459,8 +459,8 @@ export class EmailIdentityAuthEntry extends React.Component< { a: (text: string) => ( - - {text} + + {text} ), @@ -475,6 +475,7 @@ export class EmailIdentityAuthEntry extends React.Component< { a: (text: string) => ( ) => { - const action = getKeyBindingsManager().getAccessibilityAction(e); - switch (action) { - case KeyBindingAction.Enter: - e.stopPropagation(); - e.preventDefault(); - return onClick?.(e); - case KeyBindingAction.Space: - e.stopPropagation(); - e.preventDefault(); - break; - default: - onKeyDown?.(e); - } - }; - newProps.onKeyUp = (e: KeyboardEvent) => { - const action = getKeyBindingsManager().getAccessibilityAction(e); + if (element !== "button") { + // We need to consume enter onKeyDown and space onKeyUp + // otherwise we are risking also activating other keyboard focusable elements + // that might receive focus as a result of the AccessibleButtonClick action + // It's because we are using html buttons at a few places e.g. inside dialogs + // And divs which we report as role button to assistive technologies. + // Browsers handle space and enter key presses differently and we are only adjusting to the + // inconsistencies here + newProps.onKeyDown = (e: KeyboardEvent) => { + const action = getKeyBindingsManager().getAccessibilityAction(e); - switch (action) { - case KeyBindingAction.Enter: - e.stopPropagation(); - e.preventDefault(); - break; - case KeyBindingAction.Space: - e.stopPropagation(); - e.preventDefault(); - return onClick?.(e); - default: - onKeyUp?.(e); - break; - } - }; + switch (action) { + case KeyBindingAction.Enter: + e.stopPropagation(); + e.preventDefault(); + return onClick?.(e); + case KeyBindingAction.Space: + e.stopPropagation(); + e.preventDefault(); + break; + default: + onKeyDown?.(e); + } + }; + newProps.onKeyUp = (e: KeyboardEvent) => { + const action = getKeyBindingsManager().getAccessibilityAction(e); + + switch (action) { + case KeyBindingAction.Enter: + e.stopPropagation(); + e.preventDefault(); + break; + case KeyBindingAction.Space: + e.stopPropagation(); + e.preventDefault(); + return onClick?.(e); + default: + onKeyUp?.(e); + break; + } + }; + } } // Pass through the ref - used for keyboard shortcut access to some buttons diff --git a/apps/web/src/components/views/elements/CopyableText.tsx b/apps/web/src/components/views/elements/CopyableText.tsx index 8deaad1d4f..834386e450 100644 --- a/apps/web/src/components/views/elements/CopyableText.tsx +++ b/apps/web/src/components/views/elements/CopyableText.tsx @@ -44,6 +44,7 @@ export const CopyTextButton: React.FC = ({ children, getTextToCopy, border = true }); return ( -
+ {children} -
+ ); }; diff --git a/apps/web/src/components/views/elements/LearnMore.tsx b/apps/web/src/components/views/elements/LearnMore.tsx index 7e61bcc789..7be2809e1b 100644 --- a/apps/web/src/components/views/elements/LearnMore.tsx +++ b/apps/web/src/components/views/elements/LearnMore.tsx @@ -29,7 +29,13 @@ const LearnMore: React.FC = ({ title, description, ...rest }) => { }; return ( - + {_t("action|learn_more")} ); diff --git a/apps/web/src/components/views/elements/Spinner.tsx b/apps/web/src/components/views/elements/Spinner.tsx index a3ba625e89..4df3177976 100644 --- a/apps/web/src/components/views/elements/Spinner.tsx +++ b/apps/web/src/components/views/elements/Spinner.tsx @@ -15,6 +15,11 @@ interface IProps { size?: number; message?: string; onFinished: any; // XXX: Spinner pretends to be a dialog so it must accept an onFinished, but it never calls it + /** + * Whether to render the content in a div or span. + * @default "div" + */ + as?: "span" | "div"; } export default class Spinner extends React.PureComponent { @@ -23,16 +28,16 @@ export default class Spinner extends React.PureComponent { }; public render(): React.ReactNode { - const { size, message } = this.props; + const { size, message, as: Component = "div" } = this.props; return ( -
+ {message && (
{message}
 
)} -
+ ); } } diff --git a/apps/web/src/components/views/right_panel/VerificationPanel.tsx b/apps/web/src/components/views/right_panel/VerificationPanel.tsx index fa3a4dc4db..d369f98d3a 100644 --- a/apps/web/src/components/views/right_panel/VerificationPanel.tsx +++ b/apps/web/src/components/views/right_panel/VerificationPanel.tsx @@ -255,7 +255,7 @@ export default class VerificationPanel extends React.PureComponent - +

); } diff --git a/apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx b/apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx index d200f487eb..89ce9533be 100644 --- a/apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx +++ b/apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx @@ -91,7 +91,7 @@ function Description({ isEncrypted }: DescriptionProps): JSX.Element { } else { const button = { a: (sub: string) => ( - + {sub} ), diff --git a/apps/web/src/components/views/settings/EventIndexPanel.tsx b/apps/web/src/components/views/settings/EventIndexPanel.tsx index 24acd0f8a6..4cd7a7d015 100644 --- a/apps/web/src/components/views/settings/EventIndexPanel.tsx +++ b/apps/web/src/components/views/settings/EventIndexPanel.tsx @@ -220,7 +220,12 @@ export default class EventIndexPanel extends React.Component

- + {_t("action|reset")}

diff --git a/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 15ca6e9788..5bb8780b3c 100644 --- a/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -137,6 +137,7 @@ export default class SecurityRoomSettingsTab extends React.Component ( { dialog.close(); @@ -334,6 +335,7 @@ export default class SecurityRoomSettingsTab extends React.Component ( { dialog.close();