From 562dac298570442f0e854c5fe7d4268699e23872 Mon Sep 17 00:00:00 2001 From: mkljczk Date: Sun, 2 Feb 2025 20:50:37 +0100 Subject: [PATCH] pl-fe: emoji picker transition styles Signed-off-by: mkljczk --- packages/pl-fe/src/components/ui/popover.tsx | 2 +- .../emoji-picker-dropdown-container.tsx | 32 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/pl-fe/src/components/ui/popover.tsx b/packages/pl-fe/src/components/ui/popover.tsx index 7b419c192..ffbb895bf 100644 --- a/packages/pl-fe/src/components/ui/popover.tsx +++ b/packages/pl-fe/src/components/ui/popover.tsx @@ -92,7 +92,7 @@ const Popover: React.FC = ({ children, content, referenceElementClassN 'aria-expanded': isOpen, })} - {(isMounted) && ( + {isMounted && (
= ({ theme = 'default', children, ...props }) => { const intl = useIntl(); const title = intl.formatMessage(messages.emoji); - const [visible, setVisible] = useState(false); + const [isOpen, setIsOpen] = useState(false); - const { x, y, strategy, refs, update } = useFloating({ + const { x, y, strategy, refs, update, context, placement } = useFloating({ + open: isOpen, middleware: [flip(), shift()], whileElementsMounted: autoUpdate, }); + const { isMounted, styles } = useTransitionStyles(context, { + initial: { + opacity: 0, + transform: 'scale(0.8)', + transformOrigin: placement === 'bottom' ? 'top' : 'bottom', + }, + duration: { + open: 100, + close: 100, + }, + }); + useClickOutside(refs, () => { - setVisible(false); + setIsOpen(false); }); const handleClick = (e: MouseEvent) => { e.stopPropagation(); e.preventDefault(); - setVisible(!visible); + setIsOpen(!isOpen); }; const handleKeyDown = (e: KeyboardEvent) => { if (['Enter', ' '].includes(e.key)) { e.stopPropagation(); e.preventDefault(); - setVisible(!visible); + setIsOpen(!isOpen); } }; @@ -67,14 +80,14 @@ const EmojiPickerDropdownContainer: React.FC = ({ src={require('@tabler/icons/outline/mood-smile.svg')} title={title} aria-label={title} - aria-expanded={visible} + aria-expanded={isOpen} role='button' onClick={handleClick as any} onKeyDown={handleKeyDown as React.KeyboardEventHandler} tabIndex={0} />)} - {visible && ( + {isMounted && (
= ({ top: y ?? 0, left: x ?? 0, width: 'max-content', + ...styles, }} >