diff --git a/packages/web/src/javascripts/Components/FilePreview/FilePreviewInfoPanel.tsx b/packages/web/src/javascripts/Components/FilePreview/FilePreviewInfoPanel.tsx index df3c9ee22..4ef5ca155 100644 --- a/packages/web/src/javascripts/Components/FilePreview/FilePreviewInfoPanel.tsx +++ b/packages/web/src/javascripts/Components/FilePreview/FilePreviewInfoPanel.tsx @@ -9,7 +9,7 @@ type Props = { const FilePreviewInfoPanel: FunctionComponent = ({ file }) => { return ( -
+
File information
diff --git a/packages/web/src/javascripts/Components/FilePreview/FilePreviewModal.tsx b/packages/web/src/javascripts/Components/FilePreview/FilePreviewModal.tsx index 26a8f4a5e..7840ef15c 100644 --- a/packages/web/src/javascripts/Components/FilePreview/FilePreviewModal.tsx +++ b/packages/web/src/javascripts/Components/FilePreview/FilePreviewModal.tsx @@ -1,5 +1,4 @@ import { WebApplication } from '@/Application/Application' -import { DialogContent } from '@reach/dialog' import { FunctionComponent, KeyboardEventHandler, useCallback, useMemo, useRef, useState } from 'react' import { getFileIconComponent } from './getFileIconComponent' import Icon from '@/Components/Icon/Icon' @@ -20,6 +19,8 @@ import { mergeRefs } from '@/Hooks/mergeRefs' import { classNames } from '@standardnotes/snjs' import { isIOS } from '@/Utils' import ModalOverlay from '../Modal/ModalOverlay' +import Modal from '../Modal/Modal' +import { MutuallyExclusiveMediaQueryBreakpoints, useMediaQuery } from '@/Hooks/useMediaQuery' type Props = { application: WebApplication @@ -104,23 +105,63 @@ const FilePreviewModal = observer(({ application, viewControllerManager }: Props } }, [application.items, currentFile, setCurrentFile]) + const isMobileScreen = useMediaQuery(MutuallyExclusiveMediaQueryBreakpoints.sm) + + const toggleOptionsMenu = () => setShowOptionsMenu((show) => !show) + const closeOptionsMenu = () => setShowOptionsMenu(false) + const toggleInfoPanel = () => setShowFileInfoPanel((show) => !show) + const toggleLinkedBubblesContainer = () => setShowLinkedBubblesContainer((show) => !show) + if (!currentFile) { return null } return ( - } + disableCustomHeader={isMobileScreen} >
-
+
{IconComponent}
{isRenaming ? ( @@ -160,7 +201,7 @@ const FilePreviewModal = observer(({ application, viewControllerManager }: Props
)} -
-
+
+
{showFileInfoPanel && }
- + ) }) diff --git a/packages/web/src/javascripts/Components/Modal/Modal.tsx b/packages/web/src/javascripts/Components/Modal/Modal.tsx index 459553579..754eabc58 100644 --- a/packages/web/src/javascripts/Components/Modal/Modal.tsx +++ b/packages/web/src/javascripts/Components/Modal/Modal.tsx @@ -146,7 +146,7 @@ const Modal = ({ togglePopover={() => setShowAdvanced((show) => !show)} align="start" portal={false} - className="!fixed w-1/2 !min-w-0 divide-y divide-border border border-border" + className="!fixed divide-y divide-border border border-border" > {extraActions .filter((action) => action.type !== 'cancel') @@ -157,7 +157,10 @@ const Modal = ({ action.type === 'destructive' && 'text-danger', )} key={index} - onClick={action.onClick} + onClick={() => { + action.onClick() + setShowAdvanced(false) + }} disabled={action.disabled} > {action.label} diff --git a/packages/web/src/javascripts/Components/Popover/GetPositionedPopoverStyles.ts b/packages/web/src/javascripts/Components/Popover/GetPositionedPopoverStyles.ts index ebf938808..dca8ab06b 100644 --- a/packages/web/src/javascripts/Components/Popover/GetPositionedPopoverStyles.ts +++ b/packages/web/src/javascripts/Components/Popover/GetPositionedPopoverStyles.ts @@ -5,6 +5,8 @@ import { PopoverAlignment, PopoverSide } from './Types' import { OppositeSide, checkCollisions, getNonCollidingAlignment, getOverflows } from './Utils/Collisions' import { getAppRect, getPopoverMaxHeight, getPositionedPopoverRect } from './Utils/Rect' +const percentOf = (percent: number, value: number) => (percent / 100) * value + const getStylesFromRect = ( rect: DOMRect, options: { @@ -15,16 +17,18 @@ const getStylesFromRect = ( const { disableMobileFullscreenTakeover = false, maxHeight = 'none' } = options const canApplyMaxHeight = maxHeight !== 'none' && (!isMobileScreen() || disableMobileFullscreenTakeover) + const shouldApplyMobileWidth = isMobileScreen() && disableMobileFullscreenTakeover + const marginForMobile = percentOf(10, window.innerWidth) return { willChange: 'transform', - transform: `translate(${rect.x}px, ${rect.y}px)`, + transform: `translate(${shouldApplyMobileWidth ? marginForMobile / 2 : rect.x}px, ${rect.y}px)`, visibility: 'visible', ...(canApplyMaxHeight && { maxHeight: `${maxHeight}px`, }), - ...(disableMobileFullscreenTakeover && { - maxWidth: `${window.innerWidth - rect.x * 2}px`, + ...(shouldApplyMobileWidth && { + width: `${window.innerWidth - marginForMobile}px`, }), } }