Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 49 additions & 19 deletions src/tedi/components/tags/status-badge/status-badge.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { Meta, StoryFn, StoryObj } from '@storybook/react';
import { Fragment } from 'react/jsx-runtime';

import { Text } from '../../base/typography/text/text';
import { Col, Row } from '../../layout/grid';
import { VerticalSpacing } from '../../layout/vertical-spacing';
import { StatusBadge, StatusBadgeColor, StatusBadgeProps, StatusBadgeStatus } from './status-badge';
import { Tooltip } from '../../overlays/tooltip';
import { StatusBadge, StatusBadgeColor, StatusBadgeProps, StatusBadgeSize, StatusBadgeStatus } from './status-badge';

/**
* <a href="https://www.figma.com/file/jWiRIXhHRxwVdMSimKX2FF/TEDI-Design-System-(draft)?type=design&node-id=2385-24154&m=dev" target="_BLANK">Figma ↗</a><br/>
Expand Down Expand Up @@ -31,9 +33,14 @@ export default meta;

type Story = StoryObj<typeof StatusBadge>;

interface TemplateMultipleProps<Type = StatusBadgeProps['size']> extends StatusBadgeProps {
array: Type[];
}

const colors: StatusBadgeColor[] = ['neutral', 'brand', 'accent', 'warning', 'danger', 'success'];
const variants: StatusBadgeProps['variant'][] = ['filled', 'filled-bordered', 'bordered'];
const statuses: StatusBadgeStatus[] = ['inactive', 'success', 'warning', 'danger'];
const sizeArray: StatusBadgeSize[] = ['default', 'large'];
const colorToIconMap: Record<StatusBadgeColor, string> = {
neutral: 'edit',
brand: 'send',
Expand All @@ -43,6 +50,7 @@ const colorToIconMap: Record<StatusBadgeColor, string> = {
warning: 'warning',
transparent: 'edit',
};

const statusToIconMap: Record<StatusBadgeStatus, string> = {
inactive: 'edit',
success: 'send',
Expand Down Expand Up @@ -139,6 +147,35 @@ const TemplateStatusGrid: StoryFn<StatusBadgeProps> = (args) => {
);
};

const TemplateColumn: StoryFn<TemplateMultipleProps> = (args) => {
const { array } = args;

return (
<div className="example-list">
{array.map((value, key) => (
<Row className={`${key === array.length - 1 ? '' : 'border-bottom'} padding-14-16`} key={key}>
<Col width={6}>
<Text modifiers="bold">{value ? value.charAt(0).toUpperCase() + value.slice(1) : ''}</Text>
</Col>
<Col className="display-flex gap-2">
<StatusBadge {...args} color="neutral" size={array[key]} />
<StatusBadge {...args} color="neutral" size={array[key]} status="success" />
</Col>
</Row>
))}
</div>
);
};

export const Sizes: StoryObj<TemplateMultipleProps> = {
render: TemplateColumn,
args: {
array: sizeArray,
children: 'Draft',
color: 'neutral',
},
};

export const Colors: Story = {
render: TemplateAllCombos,
};
Expand All @@ -150,22 +187,15 @@ export const StatusIndicator: Story = {
},
};

const TemplateLarge: StoryFn<StatusBadgeProps> = (args) => (
<Row>
<Col width="auto">
<StatusBadge {...args} />
</Col>
<Col width="auto">
<StatusBadge {...args} status="success" />
</Col>
</Row>
);

export const Large: Story = {
render: TemplateLarge,
args: {
color: 'neutral',
size: 'large',
children: 'Draft',
},
export const WithTooltip: StoryFn<StatusBadgeProps> = () => {
return (
<Tooltip placement="top">
<Tooltip.Trigger>
<StatusBadge color="warning" icon="warning" />
</Tooltip.Trigger>
<Tooltip.Content>
Icon-only badges should always have a tooltip to provide context and ensure accessibility.
</Tooltip.Content>
</Tooltip>
);
};
8 changes: 6 additions & 2 deletions src/tedi/components/tags/status-badge/status-badge.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import cn from 'classnames';
import { forwardRef } from 'react';

import { BreakpointSupport, useBreakpointProps } from '../../../helpers';
import { Icon } from '../../base/icon/icon';
Expand Down Expand Up @@ -60,7 +61,7 @@ export interface StatusBadgeProps extends BreakpointSupport<StatusBadgePropsBrea
role?: React.AriaRole;
}

export const StatusBadge = (props: StatusBadgeProps): JSX.Element => {
export const StatusBadge = forwardRef<HTMLDivElement, StatusBadgeProps>((props, ref) => {
const { getCurrentBreakpointProps } = useBreakpointProps(props.defaultServerBreakpoint);
const {
color = 'neutral',
Expand Down Expand Up @@ -93,6 +94,7 @@ export const StatusBadge = (props: StatusBadgeProps): JSX.Element => {

return (
<BadgeElement
ref={ref}
className={badgeClass}
id={id}
title={title}
Expand All @@ -104,4 +106,6 @@ export const StatusBadge = (props: StatusBadgeProps): JSX.Element => {
{children && <span className={styles['tedi-status-badge__inner-text']}>{children}</span>}
</BadgeElement>
);
};
});

StatusBadge.displayName = 'StatusBadge';
Loading