From 92b4f0e52360b7f8899487e9f8da58f0951659b7 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Mon, 26 Jun 2023 15:38:28 +0800 Subject: [PATCH] Better hover action positioning --- .../patterns/LibraryCards/LibraryGridCard.tsx | 50 ++++- .../LibraryCards/LibraryHoverActions.tsx | 192 ++++++++---------- .../patterns/LibraryCards/LibraryListCard.tsx | 77 ++++--- .../templates/homeFeed/HomeFeedContainer.tsx | 8 +- 4 files changed, 178 insertions(+), 149 deletions(-) diff --git a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx index 25c514a6c..5fbad4e89 100644 --- a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx +++ b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx @@ -20,7 +20,6 @@ import { CardCheckbox, DescriptionStyle, LibraryItemMetadata, - MenuStyle, MetaStyle, siteName, TitleStyle, @@ -29,6 +28,14 @@ import { sortedLabels } from '../../../lib/labelsSort' import { Button } from '../../elements/Button' import { theme } from '../../tokens/stitches.config' import { LibraryHoverActions } from './LibraryHoverActions' +import { + useHover, + useFloating, + useInteractions, + size, + offset, + autoUpdate, +} from '@floating-ui/react' dayjs.extend(relativeTime) @@ -64,11 +71,29 @@ export function ProgressBar(props: ProgressBarProps): JSX.Element { export function LibraryGridCard(props: LinkedItemCardProps): JSX.Element { const [isHovered, setIsHovered] = useState(false) - const [anchor, setAnchor] = useState(null) + const [isOpen, setIsOpen] = useState(false) + + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [ + offset({ + mainAxis: -25, + }), + size(), + ], + placement: 'top-end', + whileElementsMounted: autoUpdate, + }) + + const hover = useHover(context) + + const { getReferenceProps, getFloatingProps } = useInteractions([hover]) return ( ) : ( <> - + + + { const [menuOpen, setMenuOpen] = useState(false) - const { refs, floatingStyles } = useFloating({ - elements: { - reference: props.anchor, - }, - middleware: [ - offset({ - mainAxis: -44, - crossAxis: -10, - }), - ], - placement: 'top-end', - }) return ( - - + + - + + setMenuOpen(open)} + actionHandler={props.handleAction} + triggerElement={ + + - )} - - - - setMenuOpen(open)} - actionHandler={props.handleAction} - triggerElement={ - - - - } - /> - + + } + /> ) } diff --git a/packages/web/components/patterns/LibraryCards/LibraryListCard.tsx b/packages/web/components/patterns/LibraryCards/LibraryListCard.tsx index cd0bf8490..3b69d39b7 100644 --- a/packages/web/components/patterns/LibraryCards/LibraryListCard.tsx +++ b/packages/web/components/patterns/LibraryCards/LibraryListCard.tsx @@ -1,41 +1,55 @@ import { Box, VStack, HStack, SpanBox } from '../../elements/LayoutPrimitives' import { LabelChip } from '../../elements/LabelChip' import type { LinkedItemCardProps } from './CardTypes' -import { useCallback, useState } from 'react' -import { - Archive, - ArchiveBox, - DotsThree, - Note, - Notebook, - Tag, - Trash, - Tray, -} from 'phosphor-react' +import { useCallback, useEffect, useState } from 'react' import Link from 'next/link' -import { CardMenu } from '../CardMenu' import { AuthorInfoStyle, CardCheckbox, LibraryItemMetadata, - MenuStyle, MetaStyle, siteName, TitleStyle, } from './LibraryCardStyles' import { sortedLabels } from '../../../lib/labelsSort' import { LIBRARY_LEFT_MENU_WIDTH } from '../../templates/homeFeed/LibraryFilterMenu' -import { Button } from '../../elements/Button' -import { theme } from '../../tokens/stitches.config' import { LibraryHoverActions } from './LibraryHoverActions' +import { + useHover, + useFloating, + useInteractions, + size, + offset, + autoUpdate, +} from '@floating-ui/react' export function LibraryListCard(props: LinkedItemCardProps): JSX.Element { const [isHovered, setIsHovered] = useState(false) - const [anchor, setAnchor] = useState(null) + + const [isOpen, setIsOpen] = useState(false) + + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [ + offset({ + mainAxis: -25, + // crossAxis: -10, + }), + size(), + ], + placement: 'top-end', + whileElementsMounted: autoUpdate, + }) + + const hover = useHover(context) + + const { getReferenceProps, getFloatingProps } = useInteractions([hover]) return ( ) : ( <> - + + + - {props.item.title} + + {props.item.title} +