Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[EuiStepsHorizontal] Create size prop to generate smaller step circles for horizontal steps #6928

Merged
merged 8 commits into from
Jul 11, 2023
4 changes: 4 additions & 0 deletions src-docs/src/views/steps/steps_example.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,10 @@ export const StepsExample = {
filled styling is reserved for indicating{' '}
<EuiCode>{'"current"'}</EuiCode> status.
</p>
<p>
Use the <EuiCode>size</EuiCode> property to generate smaller step
circles.
</p>
</>
),
demo: <StepsHorizontal />,
Expand Down
83 changes: 60 additions & 23 deletions src-docs/src/views/steps/steps_horizontal.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,67 @@
import React from 'react';
import React, { useState } from 'react';

import {
EuiStepsHorizontal,
EuiStepsHorizontalProps,
EuiStepsHorizontalSizes,
EuiButtonGroup,
EuiTitle,
EuiSpacer,
} from '../../../../src/components';

const horizontalSteps: EuiStepsHorizontalProps['steps'] = [
{
title: 'Completed step 1',
status: 'complete',
onClick: () => {},
},
{
title: 'Selected step 2',
status: 'current',
onClick: () => {},
},
{
title: 'Incomplete step 3 which will wrap to the next line',
onClick: () => {},
},
{
title: 'Disabled step 4',
status: 'disabled',
onClick: () => {},
},
];
export default () => {
const horizontalSteps: EuiStepsHorizontalProps['steps'] = [
{
title: 'Completed step 1',
status: 'complete',
onClick: () => {},
},
{
title: 'Selected step 2',
status: 'current',
onClick: () => {},
},
{
title: 'Incomplete step 3 which will wrap to the next line',
onClick: () => {},
},
{
title: 'Disabled step 4',
status: 'disabled',
onClick: () => {},
},
];

export default () => <EuiStepsHorizontal steps={horizontalSteps} />;
const sizeButtons = [
{
id: 's',
label: 'Small',
},
{
id: 'm',
label: 'Medium',
},
];

const [toggleSize, setToggleSize] = useState<EuiStepsHorizontalSizes>('m');

const sizeOnChange = (optionId: EuiStepsHorizontalSizes) => {
setToggleSize(optionId);
};

return (
<>
<EuiTitle size="xxs">
<h3>Step Size</h3>
</EuiTitle>
<EuiSpacer size="s" />
<EuiButtonGroup
legend="Horizontal step size toggle"
options={sizeButtons}
idSelected={toggleSize}
onChange={(id) => sizeOnChange(id as EuiStepsHorizontalSizes)}
/>
<EuiStepsHorizontal steps={horizontalSteps} size={toggleSize} />
</>
);
};
76 changes: 65 additions & 11 deletions src/components/steps/__snapshots__/step_horizontal.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,61 @@ exports[`EuiStepHorizontal is rendered 1`] = `
title="Step 1 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-incomplete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
>
Step 1 is incomplete
</span>
<span
aria-hidden="true"
class="euiStepNumber__number emotion-euiStepNumber__number-incomplete"
>
1
</span>
</span>
<span
class="euiStepHorizontal__title emotion-euiStepHorizontal__title"
/>
</button>
`;

exports[`EuiStepHorizontal props size m is rendered 1`] = `
<button
class="euiStepHorizontal emotion-euiStepHorizontal-enabled"
data-step-status="incomplete"
title="Step 1 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
>
Step 1 is incomplete
</span>
<span
aria-hidden="true"
class="euiStepNumber__number emotion-euiStepNumber__number-incomplete"
>
1
</span>
</span>
<span
class="euiStepHorizontal__title emotion-euiStepHorizontal__title"
/>
</button>
`;

exports[`EuiStepHorizontal props size s is rendered 1`] = `
<button
class="euiStepHorizontal emotion-euiStepHorizontal-enabled"
data-step-status="incomplete"
title="Step 1 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-xs-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -36,7 +90,7 @@ exports[`EuiStepHorizontal props status complete is rendered 1`] = `
title="Step 1 is complete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-complete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-complete-euiStepHorizontal__number"
>
<span
class="euiStepNumber__icon emotion-euiStepNumber__icon-complete"
Expand All @@ -58,7 +112,7 @@ exports[`EuiStepHorizontal props status current is rendered 1`] = `
title="Current step is 1"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-current-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-current-euiStepHorizontal__number"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change from s to m happens through out the EuiStepHorizontal tests and it's expected.

EuiStepHorizontal uses the EuiStepNumber component and before this PR, the titleSize prop was not being passed. That means the default size of s was being used and now that it's been updated to match the new size prop, m is being passed to EuiStepNumber.

>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -85,7 +139,7 @@ exports[`EuiStepHorizontal props status danger is rendered 1`] = `
title="Step 1 has errors"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-danger-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-danger-euiStepHorizontal__number"
>
<span
class="euiStepNumber__icon emotion-euiStepNumber__icon-danger"
Expand All @@ -107,7 +161,7 @@ exports[`EuiStepHorizontal props status disabled is rendered 1`] = `
title="Step 1 is disabled"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-disabled-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-disabled-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand Down Expand Up @@ -135,7 +189,7 @@ exports[`EuiStepHorizontal props status disabled overrides the passed status 1`]
title="Step 1 is disabled"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-disabled-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-disabled-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -162,7 +216,7 @@ exports[`EuiStepHorizontal props status incomplete is rendered 1`] = `
title="Step 1 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-incomplete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -189,7 +243,7 @@ exports[`EuiStepHorizontal props status loading is rendered 1`] = `
title="Step 1 is loading"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-loading-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-loading-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -215,7 +269,7 @@ exports[`EuiStepHorizontal props status warning is rendered 1`] = `
title="Step 1 has warnings"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-warning-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-warning-euiStepHorizontal__number"
>
<span
class="euiStepNumber__icon emotion-euiStepNumber__icon-warning"
Expand All @@ -237,7 +291,7 @@ exports[`EuiStepHorizontal props step 1`] = `
title="Step 5 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-incomplete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand All @@ -264,7 +318,7 @@ exports[`EuiStepHorizontal props title 1`] = `
title="Step 1: First step is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-incomplete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ exports[`EuiStepsHorizontal is rendered 1`] = `
title="Step 1: Completed Step 1 is complete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-complete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-complete-euiStepHorizontal__number"
>
<span
class="euiStepNumber__icon emotion-euiStepNumber__icon-complete"
Expand All @@ -41,7 +41,7 @@ exports[`EuiStepsHorizontal is rendered 1`] = `
title="Current step 2: Selected Step 2"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-current-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-current-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand Down Expand Up @@ -71,7 +71,7 @@ exports[`EuiStepsHorizontal is rendered 1`] = `
title="Step 3: Incomplete Step 3 is incomplete"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-incomplete-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-incomplete-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand Down Expand Up @@ -101,7 +101,7 @@ exports[`EuiStepsHorizontal is rendered 1`] = `
title="Step 4: Disabled Step 4 is disabled"
>
<span
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-s-disabled-euiStepHorizontal__number"
class="euiStepNumber euiStepHorizontal__number emotion-euiStepNumber-m-disabled-euiStepHorizontal__number"
>
<span
class="emotion-euiScreenReaderOnly"
Expand Down
5 changes: 4 additions & 1 deletion src/components/steps/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ export { EuiSubSteps } from './sub_steps';

export { EuiStepHorizontal } from './step_horizontal';

export type { EuiStepsHorizontalProps } from './steps_horizontal';
export type {
EuiStepsHorizontalProps,
EuiStepsHorizontalSizes,
} from './steps_horizontal';
export { EuiStepsHorizontal } from './steps_horizontal';

export type { EuiStepStatus, EuiStepNumberProps } from './step_number';
Expand Down
25 changes: 20 additions & 5 deletions src/components/steps/step_horizontal.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
} from '../../global_styling/';
import { euiTitle } from '../title/title.styles';
import { euiStepVariables } from './step.styles';
import { EuiStepsHorizontalSizes } from './steps_horizontal';

export const euiStepHorizontalStyles = (euiThemeContext: UseEuiTheme) => {
const { euiTheme } = euiThemeContext;
Expand All @@ -28,6 +29,22 @@ export const euiStepHorizontalStyles = (euiThemeContext: UseEuiTheme) => {
* e.g. due to some of their titles wrapping to multiple lines
*/

const _generateStepSizeAndInset = (size: EuiStepsHorizontalSizes) => {
const stepNumberSize =
size === 's' ? euiStep.numberXSSize : euiStep.numberSize;

return css`
&::before,
&::after {
inline-size: calc(50% - (${stepNumberSize} / 2));
inset-block-start: ${mathWithUnits(
[euiTheme.size.l, stepNumberSize],
(x, y) => x + y / 2
)};
} /* 1 */
`;
};

return {
euiStepHorizontal: css`
${logicalShorthandCSS(
Expand All @@ -49,11 +66,6 @@ export const euiStepHorizontalStyles = (euiThemeContext: UseEuiTheme) => {
position: absolute;
background-color: ${euiTheme.border.color};
block-size: ${euiTheme.border.width.thick};
inline-size: calc(50% - (${euiStep.numberSize} / 2));
inset-block-start: ${mathWithUnits(
[euiTheme.size.l, euiStep.numberSize],
(x, y) => x + y / 2
)};
z-index: ${euiTheme.levels.content}; /* 1 */
}

Expand All @@ -65,6 +77,9 @@ export const euiStepHorizontalStyles = (euiThemeContext: UseEuiTheme) => {
inset-inline-end: 0;
}
`,
// Adjust the size of the step number and connecting lines based on size
m: _generateStepSizeAndInset('m'),
s: _generateStepSizeAndInset('s'),
// Note: these selectors must be nested because focus/hover state
// is on the parent container, but affects specific children
enabled: css`
Expand Down
13 changes: 13 additions & 0 deletions src/components/steps/step_horizontal.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { shouldRenderCustomStyles } from '../../test/internal';

import { STATUS } from './step_number';
import { EuiStepHorizontal } from './step_horizontal';
import { SIZES } from './steps_horizontal';

describe('EuiStepHorizontal', () => {
shouldRenderCustomStyles(
Expand Down Expand Up @@ -64,6 +65,18 @@ describe('EuiStepHorizontal', () => {
});
});

describe('size', () => {
SIZES.forEach((size) => {
test(`${size} is rendered`, () => {
const component = render(
<EuiStepHorizontal size={size} onClick={() => {}} />
);

expect(component).toMatchSnapshot();
});
});
});

describe('onClick', () => {
test('is called when clicked', () => {
const onClickHandler = jest.fn();
Expand Down
Loading