diff --git a/src/app.css b/src/app.css index ee127f6a..7834b5e2 100644 --- a/src/app.css +++ b/src/app.css @@ -1577,7 +1577,7 @@ body > .szh-menu-container { position: fixed !important; z-index: 10; } -.szh-menu-container:has(.szh-menu--state-open) { +.szh-menu-container:not(:empty) { inset: 0; inset: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index f3b2ecaa..142bc998 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -29,6 +29,7 @@ import Icon from './icon'; import Link from './link'; import ListAddEdit from './list-add-edit'; import Loader from './loader'; +import Menu2 from './menu2'; import MenuConfirm from './menu-confirm'; import Modal from './modal'; import TranslationBlock from './translation-block'; @@ -906,7 +907,6 @@ function RelatedActions({ }, [info, isSelf]); const loading = relationshipUIState === 'loading'; - const menuInstanceRef = useRef(null); const [showTranslatedBio, setShowTranslatedBio] = useState(false); const [showAddRemoveLists, setShowAddRemoveLists] = useState(false); @@ -947,8 +947,7 @@ function RelatedActions({ <span>{privateNote}</span> </button> )} - <Menu - instanceRef={menuInstanceRef} + <Menu2 portal={{ target: document.body, }} @@ -957,16 +956,10 @@ function RelatedActions({ // Higher than the backdrop zIndex: 1001, }, - onClick: (e) => { - if (e.target === e.currentTarget) { - menuInstanceRef.current?.closeMenu?.(); - } - }, }} align="center" position="anchor" overflow="auto" - boundingBoxPadding="8 8 8 8" menuButton={ <button type="button" @@ -1215,7 +1208,7 @@ function RelatedActions({ </MenuItem> */} </> )} - </Menu> + </Menu2> {!relationship && relationshipUIState === 'loading' && ( <Loader abrupt /> )} diff --git a/src/components/media-alt-modal.jsx b/src/components/media-alt-modal.jsx index 58908013..5c99d925 100644 --- a/src/components/media-alt-modal.jsx +++ b/src/components/media-alt-modal.jsx @@ -7,6 +7,7 @@ import localeMatch from '../utils/locale-match'; import states from '../utils/states'; import Icon from './icon'; +import Menu2 from './menu2'; import TranslationBlock from './translation-block'; export default function MediaAltModal({ alt, lang, onClose }) { @@ -33,7 +34,7 @@ export default function MediaAltModal({ alt, lang, onClose }) { <header class="header-grid"> <h2>Media description</h2> <div class="header-side"> - <Menu + <Menu2 align="end" menuButton={ <button type="button" class="plain4"> @@ -50,7 +51,7 @@ export default function MediaAltModal({ alt, lang, onClose }) { <Icon icon="translate" /> <span>Translate</span> </MenuItem> - </Menu> + </Menu2> </div> </header> <main lang={lang} dir="auto"> diff --git a/src/components/media-modal.jsx b/src/components/media-modal.jsx index 46ea7661..3b80630b 100644 --- a/src/components/media-modal.jsx +++ b/src/components/media-modal.jsx @@ -15,6 +15,7 @@ import states from '../utils/states'; import Icon from './icon'; import Link from './link'; import Media from './media'; +import Menu2 from './menu2'; import MenuLink from './menu-link'; function MediaModal({ @@ -259,11 +260,10 @@ function MediaModal({ <span /> )} <span> - <Menu + <Menu2 overflow="auto" align="end" position="anchor" - boundingBoxPadding="8 8 8 8" gap={4} menuClassName="glass-menu" menuButton={ @@ -284,7 +284,7 @@ function MediaModal({ <Icon icon="popout" /> <span>Open original media</span> </MenuLink> - </Menu>{' '} + </Menu2>{' '} <Link to={`${instance ? `/${instance}` : ''}/s/${statusID}${ window.matchMedia('(min-width: calc(40em + 350px))').matches diff --git a/src/components/menu2.jsx b/src/components/menu2.jsx index 98459113..6ca68320 100644 --- a/src/components/menu2.jsx +++ b/src/components/menu2.jsx @@ -6,13 +6,15 @@ import safeBoundingBoxPadding from '../utils/safe-bounding-box-padding'; // It's like Menu but with sensible defaults, bug fixes and improvements. function Menu2(props) { - const { containerProps } = props; + const { containerProps, instanceRef: _instanceRef } = props; const size = useWindowSize(); - const instanceRef = useRef(); + const instanceRef = _instanceRef?.current ? _instanceRef : useRef(); + return ( <Menu boundingBoxPadding={safeBoundingBoxPadding()} repositionFlag={`${size.width}x${size.height}`} + unmountOnClose {...props} instanceRef={instanceRef} containerProps={{ diff --git a/src/components/shortcuts.jsx b/src/components/shortcuts.jsx index 46965882..fbb3520d 100644 --- a/src/components/shortcuts.jsx +++ b/src/components/shortcuts.jsx @@ -14,6 +14,7 @@ import states from '../utils/states'; import AsyncText from './AsyncText'; import Icon from './icon'; import Link from './link'; +import Menu2 from './menu2'; import MenuLink from './menu-link'; function Shortcuts() { @@ -139,11 +140,10 @@ function Shortcuts() { </ul> </nav> ) : ( - <Menu + <Menu2 instanceRef={menuRef} overflow="auto" viewScroll="close" - boundingBoxPadding="8 8 8 8" menuClassName="glass-menu shortcuts-menu" gap={8} position="anchor" @@ -195,7 +195,7 @@ function Shortcuts() { </MenuLink> ); })} - </Menu> + </Menu2> )} </div> ); diff --git a/src/components/status.jsx b/src/components/status.jsx index 9e0f2dfb..202ba726 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -28,6 +28,7 @@ import { snapshot } from 'valtio/vanilla'; import AccountBlock from '../components/account-block'; import EmojiText from '../components/emoji-text'; import Loader from '../components/loader'; +import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; import Modal from '../components/modal'; import NameText from '../components/name-text'; @@ -1629,7 +1630,7 @@ function Status({ onClick={bookmarkStatus} /> </div> - <Menu + <Menu2 portal={{ target: document.querySelector('.status-deck') || document.body, @@ -1638,7 +1639,6 @@ function Status({ gap={4} overflow="auto" viewScroll="close" - boundingBoxPadding="8 8 8 8" menuButton={ <div class="action"> <button @@ -1652,7 +1652,7 @@ function Status({ } > {StatusMenuItems} - </Menu> + </Menu2> </div> </> )} diff --git a/src/pages/accounts.jsx b/src/pages/accounts.jsx index 59d43719..5d57ba21 100644 --- a/src/pages/accounts.jsx +++ b/src/pages/accounts.jsx @@ -7,6 +7,7 @@ import { useReducer } from 'preact/hooks'; import Avatar from '../components/avatar'; import Icon from '../components/icon'; import Link from '../components/link'; +import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; import NameText from '../components/name-text'; import { api } from '../utils/api'; @@ -92,7 +93,7 @@ function Accounts({ onClose }) { <span class="tag">Default</span>{' '} </> )} - <Menu + <Menu2 align="end" menuButton={ <button @@ -150,7 +151,7 @@ function Accounts({ onClose }) { <Icon icon="exit" /> <span>Log out…</span> </MenuConfirm> - </Menu> + </Menu2> </div> </li> ); diff --git a/src/pages/status.jsx b/src/pages/status.jsx index e8de6597..22ffdb83 100644 --- a/src/pages/status.jsx +++ b/src/pages/status.jsx @@ -23,6 +23,7 @@ import Icon from '../components/icon'; import Link from '../components/link'; import Loader from '../components/loader'; import MediaModal from '../components/media-modal'; +import Menu2 from '../components/menu2'; import NameText from '../components/name-text'; import RelativeTime from '../components/relative-time'; import Status from '../components/status'; @@ -1034,7 +1035,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { > <Icon icon="layout4" size="l" /> </button> - <Menu + <Menu2 align="end" portal={{ // Need this, else the menu click will cause scroll jump @@ -1114,7 +1115,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { Switch to post's instance (<b>{postInstance}</b>) </small> </MenuItem> - </Menu> + </Menu2> <Link class="button plain deck-close" to={closeLink}> <Icon icon="x" size="xl" /> </Link>