From e5c580deab14a5fb8bea59560d230c22ccc307d4 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Wed, 17 May 2023 19:42:08 +0530 Subject: [PATCH] feat: Preferences view layout on mobile has been updated, and can be dismissed by swiping from the right --- .../icons/src/Icons/arrow-down-checkmark.svg | 6 +- .../Components/Modal/ModalOverlay.tsx | 43 ++++++----- .../Components/Modal/useModalAnimation.ts | 75 ++++++++++++++----- .../Preferences/Panes/Account/Email/Email.tsx | 8 +- .../Preferences/Panes/Appearance.tsx | 2 +- .../Panes/Appearance/EditorAppearance.tsx | 2 +- .../Panes/Backups/EmailBackups.tsx | 6 +- .../Preferences/Panes/General/Defaults.tsx | 6 +- .../Preferences/Panes/General/Labs/Labs.tsx | 5 +- .../Panes/General/Labs/LabsFeature.tsx | 2 +- .../Preferences/Panes/General/Tools.tsx | 2 +- .../Preferences/Panes/Security/Privacy.tsx | 4 +- .../TwoFactorAuthView/TwoFactorAuthView.tsx | 6 +- .../Preferences/PreferencesCanvas.tsx | 2 +- .../Preferences/PreferencesMenuView.tsx | 4 +- .../Preferences/PreferencesViewWrapper.tsx | 6 +- .../Components/Shared/AccordionItem.tsx | 8 +- packages/web/src/stylesheets/_sn.scss | 6 -- 18 files changed, 114 insertions(+), 79 deletions(-) diff --git a/packages/icons/src/Icons/arrow-down-checkmark.svg b/packages/icons/src/Icons/arrow-down-checkmark.svg index 2831ab862..b6ecf4f9c 100644 --- a/packages/icons/src/Icons/arrow-down-checkmark.svg +++ b/packages/icons/src/Icons/arrow-down-checkmark.svg @@ -1,3 +1,5 @@ - - + + \ No newline at end of file diff --git a/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx b/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx index 1b004a63b..2fce8cc9b 100644 --- a/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx +++ b/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx @@ -6,29 +6,32 @@ import { useModalAnimation } from '../Modal/useModalAnimation' type Props = { isOpen: boolean children: ReactNode + animationVariant?: 'horizontal' | 'vertical' } -const ModalOverlay = forwardRef(({ isOpen, children, ...props }: Props, ref: ForwardedRef) => { - const [isMounted, setElement] = useModalAnimation(isOpen) - const dialog = useDialogStore({ - open: isMounted, - }) +const ModalOverlay = forwardRef( + ({ isOpen, children, animationVariant, ...props }: Props, ref: ForwardedRef) => { + const [isMounted, setElement] = useModalAnimation(isOpen, animationVariant) + const dialog = useDialogStore({ + open: isMounted, + }) - if (!isMounted) { - return null - } + if (!isMounted) { + return null + } - return ( - - {children} - - ) -}) + return ( + + {children} + + ) + }, +) export default ModalOverlay diff --git a/packages/web/src/javascripts/Components/Modal/useModalAnimation.ts b/packages/web/src/javascripts/Components/Modal/useModalAnimation.ts index 557110f1f..8f54d5276 100644 --- a/packages/web/src/javascripts/Components/Modal/useModalAnimation.ts +++ b/packages/web/src/javascripts/Components/Modal/useModalAnimation.ts @@ -3,49 +3,86 @@ import { useMediaQuery, MutuallyExclusiveMediaQueryBreakpoints } from '@/Hooks/u export const IosModalAnimationEasing = 'cubic-bezier(.36,.66,.04,1)' -export const useModalAnimation = (isOpen: boolean) => { +const Animations = { + vertical: { + enter: { + keyframes: [ + { + transform: 'translateY(100%)', + }, + { + transform: 'translateY(0)', + }, + ], + transformOrigin: 'bottom', + }, + exit: { + keyframes: [ + { + transform: 'translateY(0)', + }, + { + transform: 'translateY(100%)', + }, + ], + transformOrigin: 'bottom', + }, + }, + horizontal: { + enter: { + keyframes: [ + { + transform: 'translateX(100%)', + }, + { + transform: 'translateX(0)', + }, + ], + transformOrigin: 'right', + }, + exit: { + keyframes: [ + { + transform: 'translateX(0)', + }, + { + transform: 'translateX(100%)', + }, + ], + transformOrigin: 'right', + }, + }, +} + +export const useModalAnimation = (isOpen: boolean, variant: 'horizontal' | 'vertical' = 'vertical') => { const isMobileScreen = useMediaQuery(MutuallyExclusiveMediaQueryBreakpoints.sm) return useLifecycleAnimation( { open: isOpen, enter: { - keyframes: [ - { - transform: 'translateY(100%)', - }, - { - transform: 'translateY(0)', - }, - ], + keyframes: Animations[variant].enter.keyframes, options: { easing: IosModalAnimationEasing, duration: 250, fill: 'forwards', }, initialStyle: { - transformOrigin: 'bottom', + transformOrigin: Animations[variant].enter.transformOrigin, }, }, enterCallback: (element) => { element.scrollTop = 0 }, exit: { - keyframes: [ - { - transform: 'translateY(0)', - }, - { - transform: 'translateY(100%)', - }, - ], + keyframes: Animations[variant].exit.keyframes, options: { easing: IosModalAnimationEasing, duration: 250, fill: 'forwards', }, initialStyle: { - transformOrigin: 'bottom', + transformOrigin: Animations[variant].exit.transformOrigin, }, }, }, diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx index 40e8354a7..f50f7aa14 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx @@ -110,7 +110,7 @@ const Email: FunctionComponent = ({ application }: Props) => { Email
-
+
Mute sign-in notification emails {isMuteSignInEmailsFeatureAvailable ? ( @@ -132,7 +132,7 @@ const Email: FunctionComponent = ({ application }: Props) => { )}
{isLoading ? ( - + ) : ( isMuteSignInEmailsFeatureAvailable && ( = ({ application }: Props) => { )}
-
+
Mute marketing notification emails Disables email notifications with special deals and promotions.
{isLoading ? ( - + ) : ( = ({ application }) => { Themes
-
+
Use system color scheme Automatically change active theme based on your system settings. diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Appearance/EditorAppearance.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Appearance/EditorAppearance.tsx index e13213978..b555a0109 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Appearance/EditorAppearance.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Appearance/EditorAppearance.tsx @@ -80,7 +80,7 @@ const EditorDefaults = ({ application }: Props) => { Editor appearance
-
+
Monospace Font Toggles the font style in plaintext and Super notes diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx index e3d66b930..f49766c94 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx @@ -122,7 +122,7 @@ const EmailBackups = ({ application }: Props) => { How often to receive backups.
{isLoading ? ( - + ) : ( {
Email preferences -
+
Receive a notification email if an email backup fails.
{isLoading ? ( - + ) : ( )} diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/General/Defaults.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Defaults.tsx index dd3cfc33b..9c0c2d161 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/General/Defaults.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Defaults.tsx @@ -44,7 +44,7 @@ const Defaults: FunctionComponent = ({ application }) => { Defaults {application.platform === Platform.Android && ( <> -
+
Always ask before closing app (Android) Whether a confirmation dialog should be shown before closing the app. @@ -54,7 +54,7 @@ const Defaults: FunctionComponent = ({ application }) => { )} -
+
Spellcheck @@ -65,7 +65,7 @@ const Defaults: FunctionComponent = ({ application }) => {
-
+
Add all parent tags when adding a nested tag to a note When enabled, adding a nested tag to a note will automatically add all associated parent tags. diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx index f2cecf9cd..35b6dc50a 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx @@ -62,13 +62,14 @@ const LabsPane: FunctionComponent = ({ application }) => { const premiumModal = usePremiumModal() const isMobileScreen = useMediaQuery(MutuallyExclusiveMediaQueryBreakpoints.sm) + const canShowPaneGesturesOption = isMobileScreen && typeof isPaneGesturesEnabled === 'boolean' return ( Labs
- {isMobileScreen && ( + {canShowPaneGesturesOption && ( = ({ application }) => { ) })} - {(experimentalFeatures.length === 0 || typeof isPaneGesturesEnabled === 'boolean') && ( + {experimentalFeatures.length === 0 && !canShowPaneGesturesOption && (
No experimental features available. diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/LabsFeature.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/LabsFeature.tsx index 776c5fb3b..58fde1406 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/LabsFeature.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/LabsFeature.tsx @@ -10,7 +10,7 @@ type Props = { const LabsFeature = ({ name, description, toggleFeature, isEnabled }: Props) => { return ( -
+
{name} {description} diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/General/Tools.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Tools.tsx index ba4ed1441..ac175608d 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/General/Tools.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Tools.tsx @@ -27,7 +27,7 @@ const Tools: FunctionComponent = ({ application }: Props) => { Tools
-
+
Show note saving status while editing diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx index 319fe6640..5639dd7ec 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx @@ -77,7 +77,7 @@ const Privacy: FunctionComponent = ({ application }: Props) => { Privacy
-
+
Session user agent logging @@ -87,7 +87,7 @@ const Privacy: FunctionComponent = ({ application }: Props) => {
{isLoading ? ( - + ) : ( = ({ auth, application }) => { <> -
+
-
- -
+
diff --git a/packages/web/src/javascripts/Components/Preferences/PreferencesCanvas.tsx b/packages/web/src/javascripts/Components/Preferences/PreferencesCanvas.tsx index 331a96014..9e4cb8465 100644 --- a/packages/web/src/javascripts/Components/Preferences/PreferencesCanvas.tsx +++ b/packages/web/src/javascripts/Components/Preferences/PreferencesCanvas.tsx @@ -6,7 +6,7 @@ import PaneSelector from './PaneSelector' import { PreferencesProps } from './PreferencesProps' const PreferencesCanvas: FunctionComponent = (props) => ( -
+
diff --git a/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx b/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx index 0cd6bc972..a78736b70 100644 --- a/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx +++ b/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx @@ -30,7 +30,7 @@ const PreferencesMenuView: FunctionComponent = ({ menu }) => { return (
@@ -60,7 +60,7 @@ const PreferencesMenuView: FunctionComponent = ({ menu }) => { wrapper: 'relative', button: 'focus:outline-none focus:shadow-none focus:ring-none', }} - popoverPlacement="top" + popoverPlacement="bottom" />
diff --git a/packages/web/src/javascripts/Components/Preferences/PreferencesViewWrapper.tsx b/packages/web/src/javascripts/Components/Preferences/PreferencesViewWrapper.tsx index c1ce74baf..cb84763e0 100644 --- a/packages/web/src/javascripts/Components/Preferences/PreferencesViewWrapper.tsx +++ b/packages/web/src/javascripts/Components/Preferences/PreferencesViewWrapper.tsx @@ -47,7 +47,11 @@ const PreferencesViewWrapper: FunctionComponent = ( }) return ( - + = ({ title, className = '', childr }} > {title} - +
{children} diff --git a/packages/web/src/stylesheets/_sn.scss b/packages/web/src/stylesheets/_sn.scss index fd8c91fe6..22816e9c6 100644 --- a/packages/web/src/stylesheets/_sn.scss +++ b/packages/web/src/stylesheets/_sn.scss @@ -16,12 +16,6 @@ } } -.sn-accordion-arrow-icon { - &[data-is-expanded='true'] { - transform: rotate(180deg); - } -} - .accordion-contents-container { transition: all 0.23s ease-out; transform-origin: top;