diff --git a/src/components/Empty/Empty.stories.tsx b/src/components/Empty/Empty.stories.tsx index 2873a4301..58f3e6706 100644 --- a/src/components/Empty/Empty.stories.tsx +++ b/src/components/Empty/Empty.stories.tsx @@ -44,6 +44,8 @@ export const Error_State = Empty_Story.bind({}); export const Empty_Messages = Empty_Story.bind({}); export const No_Search_Results = Empty_Story.bind({}); export const Tasks_Complete = Empty_Story.bind({}); +export const Empty_Plan = Empty_Story.bind({}); +export const Empty_Profile = Empty_Story.bind({}); export const Custom_Image = Empty_Story.bind({}); const emptyArgs: Object = { @@ -78,9 +80,25 @@ Tasks_Complete.args = { mode: EmptyMode.tasks, }; +Empty_Plan.args = { + ...emptyArgs, + mode: EmptyMode.plan, +}; + +Empty_Profile.args = { + ...emptyArgs, + mode: EmptyMode.profile, +}; + Custom_Image.args = { ...emptyArgs, - image: , + image: ( + + ), imageStyle: {}, mode: '', }; diff --git a/src/components/Empty/Empty.test.tsx b/src/components/Empty/Empty.test.tsx index 1c58f0cc1..e46aa7ddf 100644 --- a/src/components/Empty/Empty.test.tsx +++ b/src/components/Empty/Empty.test.tsx @@ -1,7 +1,11 @@ +import '@testing-library/jest-dom/extend-expect'; + import React from 'react'; import Enzyme, { mount } from 'enzyme'; import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; -import { Empty } from './'; +import { Empty, EmptyMode } from './'; +import { ConfigProvider } from '../ConfigProvider'; +import { render, waitFor } from '@testing-library/react'; Enzyme.configure({ adapter: new Adapter() }); @@ -15,11 +19,30 @@ describe('Empty', () => { }); test('empty includes the description class name', () => { - const wrapper = mount( + const { container } = render( ); - expect( - wrapper.getDOMNode().querySelector('.description-class') - ).toBeTruthy(); + expect(container.querySelector('.description-class')).toBeTruthy(); + }); + + test('empty gets theme from config provider', () => { + const { container } = render( + + + + ); + const svgElement = container.querySelector('svg'); + const pathElement = svgElement.querySelectorAll('path')[0]; + expect(pathElement).toBeInTheDocument(); + const fillValue = pathElement.getAttribute('fill'); + expect(fillValue).toBe('currentColor'); }); }); diff --git a/src/components/Empty/Empty.tsx b/src/components/Empty/Empty.tsx index 9eec0b299..f8c34524f 100644 --- a/src/components/Empty/Empty.tsx +++ b/src/components/Empty/Empty.tsx @@ -3,6 +3,8 @@ import { mergeClasses } from '../../shared/utilities'; import { EmptyMode, EmptyProps } from './Empty.types'; import { DefaultEmptyDataImg } from './SVG/DefaultEmptyDataImg'; import { DefaultEmptyMessagesImg } from './SVG/DefaultEmptyMessagesImg'; +import { DefaultEmptyPlanImg } from './SVG/DefaultEmptyPlanImg'; +import { DefaultEmptyProfileImg } from './SVG/DefaultEmptyProfileImg'; import { DefaultEmptySearchImg } from './SVG/DefaultEmptySearchImg'; import { DefaultServerErrorImg } from './SVG/DefaultServerErrorImg'; import { DefaultTasksCompleteImg } from './SVG/DefaultTasksCompleteImg'; @@ -12,6 +14,8 @@ import styles from './empty.module.scss'; const defaultEmptyDataImg = ; const defaultEmptyMessagesImg = ; +const defaultEmptyPlanImg = ; +const defaultEmptyProfileImg = ; const defaultEmptySearchImg = ; const defaultServerErrorImg = ; const defaultTasksCompleteImg = ; @@ -41,6 +45,10 @@ export const Empty: FC = React.forwardRef( return defaultServerErrorImg; case EmptyMode.messages: return defaultEmptyMessagesImg; + case EmptyMode.plan: + return defaultEmptyPlanImg; + case EmptyMode.profile: + return defaultEmptyProfileImg; case EmptyMode.search: return defaultEmptySearchImg; case EmptyMode.tasks: diff --git a/src/components/Empty/Empty.types.ts b/src/components/Empty/Empty.types.ts index ca0ac06d2..6efa57d12 100644 --- a/src/components/Empty/Empty.types.ts +++ b/src/components/Empty/Empty.types.ts @@ -2,10 +2,12 @@ import { OcBaseProps } from '../OcBase'; export enum EmptyMode { data = 'data', + error = 'error', messages = 'messages', - tasks = 'tasks', + plan = 'plan', + profile = 'profile', search = 'search', - error = 'error', + tasks = 'tasks', } export interface EmptyProps extends OcBaseProps { diff --git a/src/components/Empty/SVG/DefaultEmptyDataImg.tsx b/src/components/Empty/SVG/DefaultEmptyDataImg.tsx index 0e43302ce..bf6008917 100644 --- a/src/components/Empty/SVG/DefaultEmptyDataImg.tsx +++ b/src/components/Empty/SVG/DefaultEmptyDataImg.tsx @@ -1,55 +1,66 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultEmptyDataImg = (): JSX.Element => { return ( - + ); diff --git a/src/components/Empty/SVG/DefaultEmptyMessagesImg.tsx b/src/components/Empty/SVG/DefaultEmptyMessagesImg.tsx index dae228058..ef1762ad9 100644 --- a/src/components/Empty/SVG/DefaultEmptyMessagesImg.tsx +++ b/src/components/Empty/SVG/DefaultEmptyMessagesImg.tsx @@ -1,41 +1,45 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultEmptyMessagesImg = (): JSX.Element => { return ( diff --git a/src/components/Empty/SVG/DefaultEmptyPlanImg.tsx b/src/components/Empty/SVG/DefaultEmptyPlanImg.tsx new file mode 100644 index 000000000..e2644fb97 --- /dev/null +++ b/src/components/Empty/SVG/DefaultEmptyPlanImg.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import styles from '../empty.module.scss'; + +export const DefaultEmptyPlanImg = (): JSX.Element => { + return ( + + + + + + + + ); +}; diff --git a/src/components/Empty/SVG/DefaultEmptyProfileImg.tsx b/src/components/Empty/SVG/DefaultEmptyProfileImg.tsx new file mode 100644 index 000000000..b554913bf --- /dev/null +++ b/src/components/Empty/SVG/DefaultEmptyProfileImg.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import styles from '../empty.module.scss'; + +export const DefaultEmptyProfileImg = (): JSX.Element => { + return ( + + + + + + + + ); +}; diff --git a/src/components/Empty/SVG/DefaultEmptySearchImg.tsx b/src/components/Empty/SVG/DefaultEmptySearchImg.tsx index 3861a172b..6d16f0b0f 100644 --- a/src/components/Empty/SVG/DefaultEmptySearchImg.tsx +++ b/src/components/Empty/SVG/DefaultEmptySearchImg.tsx @@ -1,45 +1,74 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultEmptySearchImg = (): JSX.Element => { return ( - - - + + + diff --git a/src/components/Empty/SVG/DefaultServerErrorImg.tsx b/src/components/Empty/SVG/DefaultServerErrorImg.tsx index 1482f5e08..ffc3e69b2 100644 --- a/src/components/Empty/SVG/DefaultServerErrorImg.tsx +++ b/src/components/Empty/SVG/DefaultServerErrorImg.tsx @@ -1,86 +1,110 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultServerErrorImg = (): JSX.Element => { return ( - - + + ); diff --git a/src/components/Empty/SVG/DefaultTasksCompleteImg.tsx b/src/components/Empty/SVG/DefaultTasksCompleteImg.tsx index a35fc6e85..26afc22b2 100644 --- a/src/components/Empty/SVG/DefaultTasksCompleteImg.tsx +++ b/src/components/Empty/SVG/DefaultTasksCompleteImg.tsx @@ -1,86 +1,115 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultTasksCompleteImg = (): JSX.Element => { return ( - + - - + + ); diff --git a/src/components/Empty/empty.module.scss b/src/components/Empty/empty.module.scss index c21062860..e9a98a4e4 100644 --- a/src/components/Empty/empty.module.scss +++ b/src/components/Empty/empty.module.scss @@ -1,13 +1,13 @@ .empty { - margin: 0 8px; - font-family: $octuple-font-family; + margin: 0 $space-xs; + font-family: var(--font-stack-full); font-size: $text-font-size-2; line-height: $text-line-height-3; text-align: center; .empty-image { height: 120px; - margin-bottom: 24px; + margin-bottom: $space-l; img { border-style: none; @@ -17,6 +17,23 @@ svg { height: 100%; margin: auto; + + .accent-color-20 { + color: var(--empty-svg-accent-20-color); + } + .primary-color-10 { + color: var(--empty-svg-primary-10-color); + } + .primary-color-30 { + color: var(--empty-svg-primary-30-color); + } + .white-color { + color: var(--empty-svg-white-color); + } + .white-color-fill-primary-color-30-stroke { + fill: var(--empty-svg-white-color); + stroke: var(--empty-svg-primary-30-color); + } } } @@ -26,7 +43,7 @@ font-weight: $text-font-weight-semibold; line-height: $text-line-height-5; text-align: center; - margin-bottom: 8px; + margin-bottom: $space-xs; } .empty-description { @@ -39,11 +56,11 @@ } .empty-footer { - margin-top: 16px; + margin-top: $space-m; } &-default { - margin: 32px 0; + margin: $space-xl 0; .empty-image { height: 200px; diff --git a/src/components/Empty/svg/DefaultEmptyImg.tsx b/src/components/Empty/svg/DefaultEmptyImg.tsx index 72df33f2d..6ef1262f9 100644 --- a/src/components/Empty/svg/DefaultEmptyImg.tsx +++ b/src/components/Empty/svg/DefaultEmptyImg.tsx @@ -1,55 +1,66 @@ import React from 'react'; +import styles from '../empty.module.scss'; export const DefaultEmptyImg = (): JSX.Element => { return ( - + ); diff --git a/src/styles/themes/_default-theme.scss b/src/styles/themes/_default-theme.scss index a7957d605..50a6e5325 100644 --- a/src/styles/themes/_default-theme.scss +++ b/src/styles/themes/_default-theme.scss @@ -830,4 +830,10 @@ --accordion-summary-text-color: var(--text-primary-color); --accordion-summary-text-hover-color: var(--text-primary-color); --accordion-pill-shape-border-radius: var(--border-radius-xl); + + // ------ Empty theme ------ + --empty-svg-accent-20-color: var(--accent-color-20); + --empty-svg-primary-10-color: var(--primary-color-10); + --empty-svg-primary-30-color: var(--primary-color-30); + --empty-svg-white-color: var(--white-color); }