From 06be9bf0d44519cc40f5e8df9670342e53e6c714 Mon Sep 17 00:00:00 2001 From: Lene Gadewoll <lene.gadewoll@elastic.co> Date: Mon, 17 Feb 2025 13:46:45 +0700 Subject: [PATCH 1/3] feat: disable transition on mount when initialIsOpen --- .../src/components/accordion/accordion.tsx | 1 + .../accordion_children.styles.ts | 9 +++++++++ .../accordion_children/accordion_children.tsx | 19 ++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/eui/src/components/accordion/accordion.tsx b/packages/eui/src/components/accordion/accordion.tsx index 3ceb0af6bd4..7964ba60ce0 100644 --- a/packages/eui/src/components/accordion/accordion.tsx +++ b/packages/eui/src/components/accordion/accordion.tsx @@ -234,6 +234,7 @@ export class EuiAccordionClass extends Component< isLoading={isLoading} isLoadingMessage={isLoadingMessage} isOpen={this.isOpen} + initialIsOpen={initialIsOpen} > {children} </EuiAccordionChildren> diff --git a/packages/eui/src/components/accordion/accordion_children/accordion_children.styles.ts b/packages/eui/src/components/accordion/accordion_children/accordion_children.styles.ts index aed75c8447b..e575df81d1c 100644 --- a/packages/eui/src/components/accordion/accordion_children/accordion_children.styles.ts +++ b/packages/eui/src/components/accordion/accordion_children/accordion_children.styles.ts @@ -59,6 +59,15 @@ export const euiAccordionChildWrapperStyles = ( users on Chrome & FF */ ${euiFocusRing(euiThemeContext)} `, + // choosing to override transition instead of applying it conditionally + // to keep a more logical style appliance: + // default case = has transition as part of default styles (all cases expect initial isOpen=true when initialIsOpen=true) + // special case: no transition for initial isOpen=true when initialIsOpen=true + noTransition: css` + ${euiCanAnimate} { + transition: none; + } + `, isClosed: css` ${logicalCSS('height', 0)} opacity: 0; diff --git a/packages/eui/src/components/accordion/accordion_children/accordion_children.tsx b/packages/eui/src/components/accordion/accordion_children/accordion_children.tsx index d119d9b725b..86ae5dd2c09 100644 --- a/packages/eui/src/components/accordion/accordion_children/accordion_children.tsx +++ b/packages/eui/src/components/accordion/accordion_children/accordion_children.tsx @@ -10,6 +10,7 @@ import React, { FunctionComponent, HTMLAttributes, useCallback, + useEffect, useMemo, useState, } from 'react'; @@ -28,7 +29,12 @@ import { type _EuiAccordionChildrenProps = HTMLAttributes<HTMLDivElement> & Pick< EuiAccordionProps, - 'role' | 'children' | 'paddingSize' | 'isLoading' | 'isLoadingMessage' + | 'role' + | 'children' + | 'paddingSize' + | 'initialIsOpen' + | 'isLoading' + | 'isLoadingMessage' > & { isOpen: boolean; }; @@ -41,6 +47,7 @@ export const EuiAccordionChildren: FunctionComponent< isLoading, isLoadingMessage, isOpen, + initialIsOpen, ...rest }) => { /** @@ -61,12 +68,22 @@ export const EuiAccordionChildren: FunctionComponent< /** * Wrapper */ + const [hasTransition, setHasTransition] = useState(false); const wrapperStyles = euiAccordionChildWrapperStyles(euiTheme); const wrapperCssStyles = [ wrapperStyles.euiAccordion__childWrapper, isOpen ? wrapperStyles.isOpen : wrapperStyles.isClosed, + initialIsOpen && !hasTransition && isOpen && wrapperStyles.noTransition, ]; + /* Controls enabling opening/closing transitions on first interaction + when initialIsOpen=true; this only runs once */ + useEffect(() => { + if (initialIsOpen && !isOpen && !hasTransition) { + setHasTransition(true); + } + }, [isOpen, initialIsOpen, hasTransition]); + /** * Update the accordion wrapper height whenever the accordion opens, and also * whenever the child content updates (which will change the height) From b19e5c2ef34f8127969242154740ac55c497f4ca Mon Sep 17 00:00:00 2001 From: Lene Gadewoll <lene.gadewoll@elastic.co> Date: Mon, 17 Feb 2025 13:50:31 +0700 Subject: [PATCH 2/3] test: update snapshot --- .../components/accordion/__snapshots__/accordion.test.tsx.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eui/src/components/accordion/__snapshots__/accordion.test.tsx.snap b/packages/eui/src/components/accordion/__snapshots__/accordion.test.tsx.snap index 451b489a4a3..e78a5da860f 100644 --- a/packages/eui/src/components/accordion/__snapshots__/accordion.test.tsx.snap +++ b/packages/eui/src/components/accordion/__snapshots__/accordion.test.tsx.snap @@ -830,7 +830,7 @@ exports[`EuiAccordion props initialIsOpen is rendered 1`] = ` </div> <div aria-labelledby="generated-id" - class="euiAccordion__childWrapper emotion-euiAccordion__childWrapper-isOpen" + class="euiAccordion__childWrapper emotion-euiAccordion__childWrapper-isOpen-noTransition" id="12" role="group" style="block-size: 0;" From 7558d20ff99f435a4a6fcb035afc2bd4001d1863 Mon Sep 17 00:00:00 2001 From: Lene Gadewoll <lene.gadewoll@elastic.co> Date: Mon, 17 Feb 2025 14:05:23 +0700 Subject: [PATCH 3/3] chore: add changelog --- packages/eui/changelogs/upcoming/8327.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 packages/eui/changelogs/upcoming/8327.md diff --git a/packages/eui/changelogs/upcoming/8327.md b/packages/eui/changelogs/upcoming/8327.md new file mode 100644 index 00000000000..72ceb401d2f --- /dev/null +++ b/packages/eui/changelogs/upcoming/8327.md @@ -0,0 +1,2 @@ +- Updated `EuiAccordion` to prevent content from being transitioned on initial render when `initialIsOpen=true` +