Skip to content

Commit

Permalink
[EuiStepsHorizontal] Create size prop to generate smaller step circ…
Browse files Browse the repository at this point in the history
…les for horizontal steps (#6928)

* [EuiStepsHorizontal] Add size prop that generates a smaller step circle for horizontal steps

* [EuiStepsHorizontal] Add documentation for new size prop

* [EuiStepsHorizontal] Update snapshot test and add new test for size prop

* Changelog

* Whoops! Wrong changelog number

* Update src/components/steps/step_horizontal.styles.ts

Co-authored-by: Cee Chen <549407+cee-chen@users.noreply.github.com>

* [PR Feedback] Make the internal step size and inset generation flexible.

* Update upcoming_changelogs/6928.md

Co-authored-by: Cee Chen <549407+cee-chen@users.noreply.github.com>

---------

Co-authored-by: Cee Chen <549407+cee-chen@users.noreply.github.com>
  • Loading branch information
breehall and cee-chen authored Jul 11, 2023
1 parent b37980e commit 264892f
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 45 deletions.
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"
>
<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
21 changes: 16 additions & 5 deletions src/components/steps/step_horizontal.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ export const euiStepHorizontalStyles = (euiThemeContext: UseEuiTheme) => {
* e.g. due to some of their titles wrapping to multiple lines
*/

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

return {
euiStepHorizontal: css`
${logicalShorthandCSS(
Expand All @@ -49,11 +62,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 +73,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(euiStep.numberSize),
s: _generateStepSizeAndInset(euiStep.numberXSSize),
// 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

0 comments on commit 264892f

Please sign in to comment.