From 1545d7bc956c6a185908161fa692ba4a96981cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20H=C3=B8egh?= Date: Thu, 4 Jan 2024 13:27:53 +0100 Subject: [PATCH] fix(Flex.Countainer): show line divider when heading is present --- .../src/docs/uilib/layout/Examples.tsx | 2 +- .../src/docs/uilib/layout/flex/Examples.tsx | 2 +- .../uilib/layout/flex/container/Examples.tsx | 17 +++++--- .../uilib/layout/flex/container/demos.mdx | 4 +- .../components/card/stories/Card.stories.tsx | 12 +++++- .../src/components/flex/Container.tsx | 5 ++- .../flex/__tests__/Container.test.tsx | 38 +++++++++++++++++- ...excontainer-have-to-match-divider.snap.png | Bin 6653 -> 8844 bytes 8 files changed, 65 insertions(+), 15 deletions(-) diff --git a/packages/dnb-design-system-portal/src/docs/uilib/layout/Examples.tsx b/packages/dnb-design-system-portal/src/docs/uilib/layout/Examples.tsx index 81da14e5b57..6b972e78098 100644 --- a/packages/dnb-design-system-portal/src/docs/uilib/layout/Examples.tsx +++ b/packages/dnb-design-system-portal/src/docs/uilib/layout/Examples.tsx @@ -77,7 +77,7 @@ export const colors = [ export const HorizontalFlexItemResponsiveSize = () => { return ( diff --git a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/Examples.tsx b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/Examples.tsx index 6a15a119c7f..5a4ff16fff3 100644 --- a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/Examples.tsx +++ b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/Examples.tsx @@ -53,7 +53,7 @@ export const colors = [ export const HorizontalFlexItemResponsiveSize = () => { return ( diff --git a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/Examples.tsx b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/Examples.tsx index 542290bc348..a7e8ae6d621 100644 --- a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/Examples.tsx +++ b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/Examples.tsx @@ -1,6 +1,10 @@ import ComponentBox from '../../../../../shared/tags/ComponentBox' import { Card, Flex } from '@dnb/eufemia/src' -import { TestElement, Field } from '@dnb/eufemia/src/extensions/forms' +import { + TestElement, + Field, + Form, +} from '@dnb/eufemia/src/extensions/forms' export const Default = () => { return ( @@ -26,7 +30,7 @@ export const Default = () => { export const HorizontalWithFieldString = () => { return ( @@ -135,7 +139,7 @@ export const VerticalWithCard = () => { export const VerticalWithFieldString = () => { return ( - + @@ -146,14 +150,15 @@ export const VerticalWithFieldString = () => { ) } -export const VerticalSpaceDivider = () => { +export const VerticalLineDivider = () => { return ( - + + Heading diff --git a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/demos.mdx b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/demos.mdx index 5b23568b6c7..dc660651479 100644 --- a/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/demos.mdx +++ b/packages/dnb-design-system-portal/src/docs/uilib/layout/flex/container/demos.mdx @@ -40,9 +40,9 @@ Will wrap on small screens. -### Vertical space divider +### Vertical line divider - + ### Vertical aligned Field.String diff --git a/packages/dnb-eufemia/src/components/card/stories/Card.stories.tsx b/packages/dnb-eufemia/src/components/card/stories/Card.stories.tsx index 587679441e0..a31332ba75f 100644 --- a/packages/dnb-eufemia/src/components/card/stories/Card.stories.tsx +++ b/packages/dnb-eufemia/src/components/card/stories/Card.stories.tsx @@ -5,7 +5,7 @@ import React from 'react' -import { Field } from '../../../extensions/forms' +import { Field, Form } from '../../../extensions/forms' import { Card, Flex } from '../../' import { Wrapper, Box } from 'storybook-utils/helpers' @@ -149,3 +149,13 @@ export const CardSandbox = () => { ) } + +export function CardWithHeading() { + return ( + + Heading + + + + ) +} diff --git a/packages/dnb-eufemia/src/components/flex/Container.tsx b/packages/dnb-eufemia/src/components/flex/Container.tsx index e8916eb502d..55e4193bffc 100644 --- a/packages/dnb-eufemia/src/components/flex/Container.tsx +++ b/packages/dnb-eufemia/src/components/flex/Container.tsx @@ -128,12 +128,13 @@ function FlexContainer(props: Props) { const endSpacing = 0 let startSpacing = null + const isHeading = hasHeading && isHeadingElement(previousChild) if ( divider === 'line' && // No line above first element !isFirst && - // No line above/below headings - !hasHeading + // No line above heading + !isHeading ) { const spaceAboveLine = getSpaceValue(end, previousChild) ?? spacing startSpacing = (getSpaceValue(start, child) ?? spacing) as SpaceType diff --git a/packages/dnb-eufemia/src/components/flex/__tests__/Container.test.tsx b/packages/dnb-eufemia/src/components/flex/__tests__/Container.test.tsx index c3925e5a273..241f1d24fcf 100644 --- a/packages/dnb-eufemia/src/components/flex/__tests__/Container.test.tsx +++ b/packages/dnb-eufemia/src/components/flex/__tests__/Container.test.tsx @@ -5,6 +5,7 @@ import { setMedia, matchMedia } from 'mock-match-media' import Flex from '../Flex' import { createSpacingClasses } from '../../space/SpacingUtils' import { SpaceProps } from '../../Space' +import H1 from '../../../elements/H1' describe('Flex.Container', () => { it('should forward HTML attributes', () => { @@ -196,7 +197,6 @@ describe('Flex.Container', () => { expect(children[0].className).toContain('dnb-flex-item') expect(children[1].tagName).toContain('DIV') - expect(children[1].className).toContain('dnb-space') expect(children[1].className).toContain('dnb-space__top--small') expect(children[2].tagName).toContain('HR') @@ -209,7 +209,6 @@ describe('Flex.Container', () => { expect(children[3].className).toContain('dnb-flex-item') expect(children[4].tagName).toContain('DIV') - expect(children[4].className).toContain('dnb-space') expect(children[4].className).toContain('dnb-space__top--small') expect(children[5].tagName).toContain('HR') @@ -222,6 +221,41 @@ describe('Flex.Container', () => { expect(children[6].className).toContain('dnb-flex-item') }) + it('should not add line divider below heading', () => { + render( + +

Heading

+ Flex + Flex +
+ ) + + const element = document.querySelector('.dnb-flex-container') + const children = element.children + + expect(children.length).toBe(5) + expect(element.className).toContain('dnb-flex-container--divider-line') + + expect(children[0].tagName).toContain('H1') + expect(children[0].className).toContain('dnb-space__top--zero') + expect(children[0].className).toContain('dnb-space__bottom--zero') + + expect(children[1].tagName).toContain('DIV') + expect(children[1].className).toContain('dnb-space__top--small') + + expect(children[2].tagName).toContain('DIV') + expect(children[2].className).toContain('dnb-space__top--small') + + expect(children[3].tagName).toContain('HR') + expect(children[3].className).toContain( + 'dnb-space__left--zero dnb-space__bottom--zero dnb-space__right--zero dnb-space__top--zero dnb-hr' + ) + + expect(children[4].className).toContain('dnb-space__top--small') + expect(children[4].className).toContain('dnb-space__bottom--zero') + expect(children[4].className).toContain('dnb-flex-item') + }) + it('should set spacing between children', () => { const { rerender } = render( diff --git a/packages/dnb-eufemia/src/components/flex/__tests__/__image_snapshots__/flexcontainer-have-to-match-divider.snap.png b/packages/dnb-eufemia/src/components/flex/__tests__/__image_snapshots__/flexcontainer-have-to-match-divider.snap.png index 1bc146d3b5071b74be1dd56bfb933988e8cfa0ad..4b4d9c548aa1105c09e53a95bebdd8547a809772 100644 GIT binary patch literal 8844 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 literal 6653 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 G2mb?Z9XTTa