From 4f3979a3434f05c1b4d06066d9939b4baad3fee8 Mon Sep 17 00:00:00 2001 From: Jasper <8398131+jasperfirecai2@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:43:56 +0200 Subject: [PATCH 1/5] fix(CNavGroup): set default `height` state to 0 --- packages/coreui-react/src/components/nav/CNavGroup.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/coreui-react/src/components/nav/CNavGroup.tsx b/packages/coreui-react/src/components/nav/CNavGroup.tsx index 776bf104..5a7d891e 100644 --- a/packages/coreui-react/src/components/nav/CNavGroup.tsx +++ b/packages/coreui-react/src/components/nav/CNavGroup.tsx @@ -58,7 +58,7 @@ export const CNavGroup: PolymorphicRefForwardingComponent<'li', CNavGroupProps> HTMLDivElement | HTMLLIElement, CNavGroupProps >(({ children, as: Component = 'li', className, compact, idx, toggler, visible, ...rest }, ref) => { - const [height, setHeight] = useState() + const [height, setHeight] = useState(0) // eslint-disable-next-line @typescript-eslint/no-explicit-any const navItemsRef = useRef(null) From 9265cb446755156989dde6cbb4a146dae89009a0 Mon Sep 17 00:00:00 2001 From: Danikokonn Date: Thu, 10 Oct 2024 15:24:00 +0300 Subject: [PATCH 2/5] FIx CListGroup not passing props --- packages/coreui-react/src/components/list-group/CListGroup.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/coreui-react/src/components/list-group/CListGroup.tsx b/packages/coreui-react/src/components/list-group/CListGroup.tsx index becc64dd..1dce9007 100644 --- a/packages/coreui-react/src/components/list-group/CListGroup.tsx +++ b/packages/coreui-react/src/components/list-group/CListGroup.tsx @@ -32,7 +32,7 @@ export interface CListGroupProps extends HTMLAttributes = forwardRef< HTMLDivElement | HTMLUListElement, CListGroupProps ->(({ children, as: Component = 'ul', className, flush, layout }, ref) => { +>(({ children, as: Component = 'ul', className, flush, layout, ...rest }, ref) => { return ( {children} From a93c502756003bfd3c722075cffa086e5594bc1b Mon Sep 17 00:00:00 2001 From: mrholek Date: Tue, 29 Oct 2024 00:26:57 +0100 Subject: [PATCH 3/5] refactor(CPopover, CTooltip): improve fade animation --- .../src/components/popover/CPopover.tsx | 111 ++++++++++-------- .../src/components/tooltip/CTooltip.tsx | 111 ++++++++++-------- 2 files changed, 130 insertions(+), 92 deletions(-) diff --git a/packages/coreui-react/src/components/popover/CPopover.tsx b/packages/coreui-react/src/components/popover/CPopover.tsx index 1ed3393d..d6210f73 100644 --- a/packages/coreui-react/src/components/popover/CPopover.tsx +++ b/packages/coreui-react/src/components/popover/CPopover.tsx @@ -1,4 +1,12 @@ -import React, { forwardRef, HTMLAttributes, ReactNode, useRef, useEffect, useState } from 'react' +import React, { + forwardRef, + HTMLAttributes, + ReactNode, + useEffect, + useId, + useRef, + useState, +} from 'react' import classNames from 'classnames' import PropTypes from 'prop-types' @@ -97,12 +105,13 @@ export const CPopover = forwardRef( const popoverRef = useRef(null) const togglerRef = useRef(null) const forkedRef = useForkedRef(ref, popoverRef) - const uID = useRef(`popover${Math.floor(Math.random() * 1_000_000)}`) - const { initPopper, destroyPopper } = usePopper() + const id = `popover${useId()}` const [mounted, setMounted] = useState(false) const [_visible, setVisible] = useState(visible) + const { initPopper, destroyPopper } = usePopper() + const _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay const popperConfig = { @@ -130,77 +139,87 @@ export const CPopover = forwardRef( } useEffect(() => { - setVisible(visible) + if (visible) { + handleShow() + return + } + + handleHide() }, [visible]) useEffect(() => { - if (_visible) { - setMounted(true) - - if (popoverRef.current) { - popoverRef.current.classList.remove('fade', 'show') - destroyPopper() - } - + if (mounted && togglerRef.current && popoverRef.current) { + initPopper(togglerRef.current, popoverRef.current, popperConfig) setTimeout(() => { - if (togglerRef.current && popoverRef.current) { - if (animation) { - popoverRef.current.classList.add('fade') - } - - initPopper(togglerRef.current, popoverRef.current, popperConfig) - popoverRef.current.style.removeProperty('display') - popoverRef.current.classList.add('show') - onShow && onShow() - } + setVisible(true) }, _delay.show) + + return } - return () => { - if (popoverRef.current) { - popoverRef.current.classList.remove('show') - onHide && onHide() - executeAfterTransition(() => { - if (popoverRef.current) { - popoverRef.current.style.display = 'none' - } - - destroyPopper() - setMounted(false) - }, popoverRef.current) - } + if (!mounted && togglerRef.current && popoverRef.current) { + destroyPopper() + } + }, [mounted]) + + useEffect(() => { + if (!_visible && togglerRef.current && popoverRef.current) { + executeAfterTransition(() => { + setMounted(false) + }, popoverRef.current) } }, [_visible]) + const handleShow = () => { + setMounted(true) + if (onShow) { + onShow() + } + } + + const handleHide = () => { + setTimeout(() => { + setVisible(false) + if (onHide) { + onHide() + } + }, _delay.hide) + } + return ( <> {React.cloneElement(children as React.ReactElement, { ...(_visible && { - 'aria-describedby': uID.current, + 'aria-describedby': id, }), ref: togglerRef, ...((trigger === 'click' || trigger.includes('click')) && { - onClick: () => setVisible(!_visible), + onClick: () => (_visible ? handleHide() : handleShow()), }), ...((trigger === 'focus' || trigger.includes('focus')) && { - onFocus: () => setVisible(true), - onBlur: () => setVisible(false), + onFocus: () => handleShow(), + onBlur: () => handleHide(), }), ...((trigger === 'hover' || trigger.includes('hover')) && { - onMouseEnter: () => setVisible(true), - onMouseLeave: () => setVisible(false), + onMouseEnter: () => handleShow(), + onMouseLeave: () => handleHide(), }), })} {mounted && (