From 6a2e94005c2c6e0a539a147a87e47780df3ddbb2 Mon Sep 17 00:00:00 2001 From: Adam Kudrna Date: Thu, 29 Aug 2024 19:07:52 +0200 Subject: [PATCH] BREAKING CHANGE(web-react): Remove inverted variant of `ProductLogo` #DS-1450 --- .../components/UNSTABLE_ProductLogo/README.md | 20 +----- .../UNSTABLE_ProductLogo.tsx | 16 ++--- .../__tests__/UNSTABLE_ProductLogo.test.tsx | 8 --- .../useProductLogoStyleProps.test.ts | 26 ------- .../demo/ProductLogoInverted.tsx | 64 ------------------ .../UNSTABLE_ProductLogo/demo/index.tsx | 5 -- .../components/UNSTABLE_ProductLogo/index.ts | 1 - .../stories/UNSTABLE_ProductLogo.stories.tsx | 12 ---- .../useProductLogoStyleProps.ts | 23 ------- packages/web-react/src/types/productLogo.ts | 4 +- tests/e2e/demo-components-compare.spec.ts | 1 - .../unstable-productlogo-chromium-linux.png | Bin 16258 -> 10522 bytes 12 files changed, 9 insertions(+), 171 deletions(-) delete mode 100644 packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/useProductLogoStyleProps.test.ts delete mode 100644 packages/web-react/src/components/UNSTABLE_ProductLogo/demo/ProductLogoInverted.tsx delete mode 100644 packages/web-react/src/components/UNSTABLE_ProductLogo/useProductLogoStyleProps.ts diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/README.md b/packages/web-react/src/components/UNSTABLE_ProductLogo/README.md index a0e6c61fac..399273718e 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/README.md +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/README.md @@ -13,19 +13,6 @@ import { UNSTABLE_ProductLogo } from '@spirit/web-react'; ; ``` -## Inverted variant - -You can add an `isInverted` prop to invert the color of the background. -It is necessary to insert the appropriate inverted logo variant as a children. - -```jsx -import { UNSTABLE_ProductLogo } from '@spirit/web-react'; - - - -; -``` - ## Content The content of the ProductLogo component can be an image or svg. @@ -57,10 +44,9 @@ to specify the `height` and `width` of the embedded image. ## API -| Name | Type | Default | Required | Description | -| ------------ | ----------- | ------- | -------- | ---------------------------------- | -| `children` | `ReactNode` | `null` | ✓ | Content of the ProductLogo | -| `isInverted` | `bool` | `false` | ✕ | If true, Logo has inverted variant | +| Name | Type | Default | Required | Description | +| ---------- | ----------- | ------- | -------- | -------------------------- | +| `children` | `ReactNode` | `null` | ✓ | Content of the ProductLogo | The components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/UNSTABLE_ProductLogo.tsx b/packages/web-react/src/components/UNSTABLE_ProductLogo/UNSTABLE_ProductLogo.tsx index c23fd3bc4b..9a900484d8 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/UNSTABLE_ProductLogo.tsx +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/UNSTABLE_ProductLogo.tsx @@ -2,23 +2,17 @@ import classNames from 'classnames'; import React from 'react'; -import { useStyleProps } from '../../hooks'; +import { useClassNamePrefix, useStyleProps } from '../../hooks'; import { SpiritProductLogoProps } from '../../types/productLogo'; -import { useProductLogoStyleProps } from './useProductLogoStyleProps'; - -const defaultProps: Partial = { - isInverted: false, -}; const UNSTABLE_ProductLogo = (props: SpiritProductLogoProps) => { - const propsWithDefaults = { ...defaultProps, ...props }; - const { children, ...restProps } = propsWithDefaults; + const { children, ...restProps } = props; - const { classProps, props: modifiedProps } = useProductLogoStyleProps(restProps); - const { styleProps, props: otherProps } = useStyleProps(modifiedProps); + const productLogoClass = useClassNamePrefix('UNSTABLE_ProductLogo'); + const { styleProps, props: otherProps } = useStyleProps(restProps); return ( -
+
{children}
); diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/UNSTABLE_ProductLogo.test.tsx b/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/UNSTABLE_ProductLogo.test.tsx index 5d85fd8234..36e05862c8 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/UNSTABLE_ProductLogo.test.tsx +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/UNSTABLE_ProductLogo.test.tsx @@ -24,12 +24,4 @@ describe('UNSTABLE_ProductLogo', () => { expect(screen.getByText('Content')).toHaveClass('UNSTABLE_ProductLogo'); }); - - it('should have inverted className', () => { - render(Content); - const element = screen.getByText('Content'); - - expect(element).toHaveClass('UNSTABLE_ProductLogo'); - expect(element).toHaveClass('UNSTABLE_ProductLogo--inverted'); - }); }); diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/useProductLogoStyleProps.test.ts b/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/useProductLogoStyleProps.test.ts deleted file mode 100644 index 3b1608fcfd..0000000000 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/__tests__/useProductLogoStyleProps.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { renderHook } from '@testing-library/react'; -import { useProductLogoStyleProps } from '../useProductLogoStyleProps'; - -describe('useProductLogoStyleProps', () => { - it('should return defaults', () => { - const props = {}; - const { result } = renderHook(() => useProductLogoStyleProps(props)); - - expect(result.current.classProps).toBe('UNSTABLE_ProductLogo'); - }); - - describe('isInverted prop', () => { - const props = { - isInverted: true, - }; - const { result } = renderHook(() => useProductLogoStyleProps(props)); - - it('should return inverted class names', () => { - expect(result.current.classProps).toBe('UNSTABLE_ProductLogo UNSTABLE_ProductLogo--inverted'); - }); - - it('should not return isInverted prop', () => { - expect(result.current.props).toStrictEqual({}); - }); - }); -}); diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/ProductLogoInverted.tsx b/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/ProductLogoInverted.tsx deleted file mode 100644 index 388b22218a..0000000000 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/ProductLogoInverted.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import UNSTABLE_ProductLogo from '../UNSTABLE_ProductLogo'; - -export const invertedSvgLogo = ( - - - - - - - - - - - - - - - - - - - -); - -const ProductLogoDefault = () => ( - - {invertedSvgLogo} - -); - -export default ProductLogoDefault; diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/index.tsx b/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/index.tsx index 154b2f1ccb..4979ba5046 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/index.tsx +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/demo/index.tsx @@ -2,16 +2,11 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import DocsSection from '../../../../docs/DocsSections'; import ProductLogoDefault from './ProductLogoDefault'; -import ProductLogoInverted from './ProductLogoInverted'; ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - , ); diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/index.ts b/packages/web-react/src/components/UNSTABLE_ProductLogo/index.ts index f711cb2d09..41def5f63b 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/index.ts +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/index.ts @@ -1,5 +1,4 @@ 'use client'; export * from './UNSTABLE_ProductLogo'; -export * from './useProductLogoStyleProps'; export { default as UNSTABLE_ProductLogo } from './UNSTABLE_ProductLogo'; diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/stories/UNSTABLE_ProductLogo.stories.tsx b/packages/web-react/src/components/UNSTABLE_ProductLogo/stories/UNSTABLE_ProductLogo.stories.tsx index bb9fc7d7a6..c7beeda9b2 100644 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/stories/UNSTABLE_ProductLogo.stories.tsx +++ b/packages/web-react/src/components/UNSTABLE_ProductLogo/stories/UNSTABLE_ProductLogo.stories.tsx @@ -2,7 +2,6 @@ import { Markdown } from '@storybook/blocks'; import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; import { defaultSvgLogo } from '../demo/ProductLogoDefault'; -import { invertedSvgLogo } from '../demo/ProductLogoInverted'; import ReadMe from '../README.md'; import UNSTABLE_ProductLogo from '../UNSTABLE_ProductLogo'; @@ -14,11 +13,7 @@ const meta: Meta = { page: () => {ReadMe}, }, }, - argTypes: { - isInverted: { control: 'boolean' }, - }, args: { - isInverted: false, children: defaultSvgLogo, }, }; @@ -26,13 +21,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -const ProductLogoComponent = ({ ...args }) => { - const svg = args.isInverted ? invertedSvgLogo : defaultSvgLogo; - - return {svg}; -}; - export const Default: Story = { name: 'UNSTABLE_ProductLogo', - render: ProductLogoComponent, }; diff --git a/packages/web-react/src/components/UNSTABLE_ProductLogo/useProductLogoStyleProps.ts b/packages/web-react/src/components/UNSTABLE_ProductLogo/useProductLogoStyleProps.ts deleted file mode 100644 index 025356ea7f..0000000000 --- a/packages/web-react/src/components/UNSTABLE_ProductLogo/useProductLogoStyleProps.ts +++ /dev/null @@ -1,23 +0,0 @@ -import classNames from 'classnames'; -import { useClassNamePrefix } from '../../hooks'; -import { SpiritProductLogoProps } from '../../types/productLogo'; - -export interface ProductLogoStyles { - classProps: string; - props: T; -} - -export function useProductLogoStyleProps(props: SpiritProductLogoProps): ProductLogoStyles { - const { isInverted, ...restProps } = props; - - const productLogoClass = useClassNamePrefix('UNSTABLE_ProductLogo'); - const productLogoInvertedColorClass = `${productLogoClass}--inverted`; - const classProps = classNames(productLogoClass, { - [productLogoInvertedColorClass]: isInverted, - }); - - return { - classProps, - props: restProps, - }; -} diff --git a/packages/web-react/src/types/productLogo.ts b/packages/web-react/src/types/productLogo.ts index a6f6eecf3f..ae6dfdc522 100644 --- a/packages/web-react/src/types/productLogo.ts +++ b/packages/web-react/src/types/productLogo.ts @@ -1,5 +1,3 @@ import { ChildrenProps, StyleProps } from './shared'; -export interface SpiritProductLogoProps extends ChildrenProps, StyleProps { - isInverted?: boolean; -} +export interface SpiritProductLogoProps extends ChildrenProps, StyleProps {} diff --git a/tests/e2e/demo-components-compare.spec.ts b/tests/e2e/demo-components-compare.spec.ts index 97c6008211..4c9a5d3576 100644 --- a/tests/e2e/demo-components-compare.spec.ts +++ b/tests/e2e/demo-components-compare.spec.ts @@ -38,7 +38,6 @@ const IGNORED_TESTS: string[] = [ 'UNSTABLE_ActionLayout', 'UNSTABLE_Avatar', 'UNSTABLE_EmptyState', - 'UNSTABLE_ProductLogo', 'UNSTABLE_Section', 'UNSTABLE_Slider', 'UNSTABLE_Toggle', diff --git a/tests/e2e/demo-components-compare.spec.ts-snapshots/unstable-productlogo-chromium-linux.png b/tests/e2e/demo-components-compare.spec.ts-snapshots/unstable-productlogo-chromium-linux.png index dfa8c89e6f176832a4d1e632a4e88beab2043068..55401e6ba528479a07f693adb9b50842aade49a3 100644 GIT binary patch literal 10522 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 Xr?9i%qYMXXMK$PY_g{!7FW>tQE)1B- literal 16258 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