diff --git a/packages/web/src/javascripts/Components/Footer/AccountMenuButton.tsx b/packages/web/src/javascripts/Components/Footer/AccountMenuButton.tsx index bf4594f6c..c991edf78 100644 --- a/packages/web/src/javascripts/Components/Footer/AccountMenuButton.tsx +++ b/packages/web/src/javascripts/Components/Footer/AccountMenuButton.tsx @@ -3,6 +3,7 @@ import { useRef } from 'react' import AccountMenu, { AccountMenuProps } from '../AccountMenu/AccountMenu' import Icon from '../Icon/Icon' import Popover from '../Popover/Popover' +import StyledTooltip from '../StyledTooltip/StyledTooltip' type Props = AccountMenuProps & { isOpen: boolean @@ -25,18 +26,20 @@ const AccountMenuButton = ({ return ( <> - + + + { this.viewControllerManager.quickSettingsMenuController.closeQuickSettingsMenu() } + openPreferences = () => { + this.clickOutsideQuickSettingsMenu() + this.viewControllerManager.preferencesController.openPreferences() + } + override render() { return (
@@ -361,10 +367,21 @@ class Footer extends PureComponent { isOpen={this.state.showQuickSettingsMenu} toggleMenu={this.quickSettingsClickHandler} application={this.application} - preferencesController={this.viewControllerManager.preferencesController} quickSettingsMenuController={this.viewControllerManager.quickSettingsMenuController} />
+
+ + + +
{this.state.showBetaWarning && (
@@ -417,14 +434,16 @@ class Footer extends PureComponent {
)} {this.state.hasPasscode && ( -
- -
+ +
+ +
+
)} diff --git a/packages/web/src/javascripts/Components/Footer/QuickSettingsButton.tsx b/packages/web/src/javascripts/Components/Footer/QuickSettingsButton.tsx index 182ed4f3b..a618788f0 100644 --- a/packages/web/src/javascripts/Components/Footer/QuickSettingsButton.tsx +++ b/packages/web/src/javascripts/Components/Footer/QuickSettingsButton.tsx @@ -1,40 +1,35 @@ import { WebApplication } from '@/Application/Application' -import { PreferencesController } from '@/Controllers/PreferencesController' import { QuickSettingsController } from '@/Controllers/QuickSettingsController' import { classNames } from '@/Utils/ConcatenateClassNames' import { useRef } from 'react' import Icon from '../Icon/Icon' import Popover from '../Popover/Popover' import QuickSettingsMenu from '../QuickSettingsMenu/QuickSettingsMenu' +import StyledTooltip from '../StyledTooltip/StyledTooltip' type Props = { isOpen: boolean toggleMenu: () => void application: WebApplication - preferencesController: PreferencesController quickSettingsMenuController: QuickSettingsController } -const QuickSettingsButton = ({ - application, - isOpen, - toggleMenu, - preferencesController, - quickSettingsMenuController, -}: Props) => { +const QuickSettingsButton = ({ application, isOpen, toggleMenu, quickSettingsMenuController }: Props) => { const buttonRef = useRef(null) return ( <> - + + + - + ) diff --git a/packages/web/src/javascripts/Components/QuickSettingsMenu/EventHandlers.ts b/packages/web/src/javascripts/Components/QuickSettingsMenu/EventHandlers.ts deleted file mode 100644 index 983a3ff20..000000000 --- a/packages/web/src/javascripts/Components/QuickSettingsMenu/EventHandlers.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Dispatch, RefObject, SetStateAction } from 'react' - -export const quickSettingsKeyDownHandler = ( - closeQuickSettingsMenu: () => void, - event: React.KeyboardEvent, - quickSettingsMenuRef: RefObject, - themesMenuOpen: boolean, -) => { - if (quickSettingsMenuRef?.current) { - const items: NodeListOf = quickSettingsMenuRef.current.querySelectorAll(':scope > button') - const currentFocusedIndex = Array.from(items).findIndex((btn) => btn === document.activeElement) - - if (!themesMenuOpen) { - switch (event.key) { - case 'Escape': - closeQuickSettingsMenu() - break - case 'ArrowDown': - if (items[currentFocusedIndex + 1]) { - items[currentFocusedIndex + 1].focus() - } else { - items[0].focus() - } - break - case 'ArrowUp': - if (items[currentFocusedIndex - 1]) { - items[currentFocusedIndex - 1].focus() - } else { - items[items.length - 1].focus() - } - break - } - } - } -} - -export const themesMenuKeyDownHandler = ( - event: React.KeyboardEvent, - themesMenuRef: RefObject, - setThemesMenuOpen: Dispatch>, - themesButtonRef: RefObject, -) => { - if (themesMenuRef?.current) { - const themes = themesMenuRef.current.querySelectorAll('button') - const currentFocusedIndex = Array.from(themes).findIndex((themeBtn) => themeBtn === document.activeElement) - - switch (event.key) { - case 'Escape': - case 'ArrowLeft': - event.stopPropagation() - setThemesMenuOpen(false) - themesButtonRef.current?.focus() - break - case 'ArrowDown': - if (themes[currentFocusedIndex + 1]) { - themes[currentFocusedIndex + 1].focus() - } else { - themes[0].focus() - } - break - case 'ArrowUp': - if (themes[currentFocusedIndex - 1]) { - themes[currentFocusedIndex - 1].focus() - } else { - themes[themes.length - 1].focus() - } - break - } - } -} diff --git a/packages/web/src/javascripts/Components/QuickSettingsMenu/QuickSettingsMenu.tsx b/packages/web/src/javascripts/Components/QuickSettingsMenu/QuickSettingsMenu.tsx index ccb5fd187..a4f900105 100644 --- a/packages/web/src/javascripts/Components/QuickSettingsMenu/QuickSettingsMenu.tsx +++ b/packages/web/src/javascripts/Components/QuickSettingsMenu/QuickSettingsMenu.tsx @@ -1,24 +1,20 @@ import { WebApplication } from '@/Application/Application' import { ComponentArea, ContentType, FeatureIdentifier, GetFeatures, SNComponent } from '@standardnotes/snjs' import { observer } from 'mobx-react-lite' -import { FunctionComponent, KeyboardEventHandler, useCallback, useEffect, useRef, useState } from 'react' +import { FunctionComponent, useCallback, useEffect, useRef, useState } from 'react' import Icon from '@/Components/Icon/Icon' import Switch from '@/Components/Switch/Switch' -import { quickSettingsKeyDownHandler } from './EventHandlers' import FocusModeSwitch from './FocusModeSwitch' import ThemesMenuButton from './ThemesMenuButton' import { ThemeItem } from './ThemeItem' import { sortThemes } from '@/Utils/SortThemes' import RadioIndicator from '../RadioIndicator/RadioIndicator' import HorizontalSeparator from '../Shared/HorizontalSeparator' -import Popover from '../Popover/Popover' -import { PreferencesController } from '@/Controllers/PreferencesController' import { QuickSettingsController } from '@/Controllers/QuickSettingsController' const focusModeAnimationDuration = 1255 type MenuProps = { - preferencesController: PreferencesController quickSettingsMenuController: QuickSettingsController application: WebApplication } @@ -37,20 +33,13 @@ const toggleFocusMode = (enabled: boolean) => { } } -const QuickSettingsMenu: FunctionComponent = ({ - application, - preferencesController, - quickSettingsMenuController, -}) => { +const QuickSettingsMenu: FunctionComponent = ({ application, quickSettingsMenuController }) => { const { closeQuickSettingsMenu, focusModeEnabled, setFocusModeEnabled } = quickSettingsMenuController const [themes, setThemes] = useState([]) const [toggleableComponents, setToggleableComponents] = useState([]) - const [themesMenuOpen, setThemesMenuOpen] = useState(false) const [defaultThemeOn, setDefaultThemeOn] = useState(false) - const themesButtonRef = useRef(null) const prefsButtonRef = useRef(null) - const quickSettingsMenuRef = useRef(null) const defaultThemeButtonRef = useRef(null) const mainRef = useRef(null) @@ -126,25 +115,10 @@ const QuickSettingsMenu: FunctionComponent = ({ } }, [application, reloadToggleableComponents]) - useEffect(() => { - if (themesMenuOpen) { - defaultThemeButtonRef.current?.focus() - } - }, [themesMenuOpen]) - useEffect(() => { prefsButtonRef.current?.focus() }, []) - const toggleThemesMenu = useCallback(() => { - setThemesMenuOpen((isOpen) => !isOpen) - }, []) - - const openPreferences = useCallback(() => { - closeQuickSettingsMenu() - preferencesController.openPreferences() - }, [closeQuickSettingsMenu, preferencesController]) - const toggleComponent = useCallback( (component: SNComponent) => { if (component.isTheme()) { @@ -156,29 +130,6 @@ const QuickSettingsMenu: FunctionComponent = ({ [application], ) - const handleBtnKeyDown: React.KeyboardEventHandler = useCallback( - (event) => { - switch (event.key) { - case 'Escape': - setThemesMenuOpen(false) - themesButtonRef.current?.focus() - break - case 'ArrowRight': - if (!themesMenuOpen) { - toggleThemesMenu() - } - } - }, - [themesMenuOpen, toggleThemesMenu], - ) - - const handleQuickSettingsKeyDown: KeyboardEventHandler = useCallback( - (event) => { - quickSettingsKeyDownHandler(closeQuickSettingsMenu, event, quickSettingsMenuRef, themesMenuOpen) - }, - [closeQuickSettingsMenu, themesMenuOpen], - ) - const toggleDefaultTheme = useCallback(() => { const activeTheme = themes.map((item) => item.component).find((theme) => theme?.active && !theme.isLayerable()) if (activeTheme) { @@ -187,41 +138,21 @@ const QuickSettingsMenu: FunctionComponent = ({ }, [application, themes]) return ( -
-
Quick Settings
+
+
Themes
- -
Themes
- - {themes.map((theme) => ( - - ))} -
+ {themes.map((theme) => ( + + ))} + +
Tools
{toggleableComponents.map((component) => (
) } diff --git a/packages/web/src/javascripts/Components/StyledTooltip/StyledTooltip.tsx b/packages/web/src/javascripts/Components/StyledTooltip/StyledTooltip.tsx new file mode 100644 index 000000000..fc282bc96 --- /dev/null +++ b/packages/web/src/javascripts/Components/StyledTooltip/StyledTooltip.tsx @@ -0,0 +1,14 @@ +import Tooltip from '@reach/tooltip' +import styled from 'styled-components' + +export default styled(Tooltip)` + &[data-reach-tooltip] { + border-radius: 0.25rem; + font-size: 0.875rem; + padding: 0.375rem 0.75rem; + background-color: var(--sn-stylekit-contrast-background-color); + color: var(--sn-stylekit-foreground-color); + border-color: var(--sn-stylekit-border-color); + z-index: var(--z-index-tooltip); + } +` diff --git a/packages/web/src/stylesheets/_main.scss b/packages/web/src/stylesheets/_main.scss index f276971e5..52e224ac4 100644 --- a/packages/web/src/stylesheets/_main.scss +++ b/packages/web/src/stylesheets/_main.scss @@ -13,6 +13,7 @@ --z-index-lock-screen: 10000; --z-index-modal: 10000; --z-index-toast: 11000; + --z-index-tooltip: 12000; --sn-stylekit-base-font-size: 0.813rem; --sn-stylekit-simplified-chinese-font: 'Microsoft Yahei', '微软雅黑体'; diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js index 6899a158c..e67a603f0 100644 --- a/packages/web/tailwind.config.js +++ b/packages/web/tailwind.config.js @@ -73,6 +73,7 @@ module.exports = { 'lock-screen': 'var(--z-index-lock-screen)', modal: 'var(--z-index-modal)', toast: 'var(--z-index-toast)', + tooltip: 'var(--z-index-tooltip)', }, boxShadow: { inner: