You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
portainer/app/react/components/Widget/Widget.stories.tsx

98 lines
2.1 KiB

import { ReactNode } from 'react';
import type { Meta } from '@storybook/react';
import { User } from 'lucide-react';
import { Widget } from './Widget';
import { WidgetBody } from './WidgetBody';
import { WidgetTitle } from './WidgetTitle';
import { WidgetFooter } from './WidgetFooter';
import { WidgetTaskbar } from './WidgetTaskbar';
interface WidgetProps {
loading: boolean;
title: string;
icon: ReactNode;
bodyText: string;
footerText: string;
}
const meta: Meta<WidgetProps> = {
title: 'Widget',
component: Widget,
args: {
loading: false,
title: 'Title',
icon: User,
bodyText: 'Body',
footerText: 'Footer',
},
};
export default meta;
export { Default, WidgetWithCustomImage, WidgetWithTaskBar };
function Default({ loading, bodyText, footerText, icon, title }: WidgetProps) {
return (
<Widget>
<WidgetTitle title={title} icon={icon} />
<WidgetBody loading={loading}>{bodyText}</WidgetBody>
<WidgetFooter>{footerText}</WidgetFooter>
</Widget>
);
}
function WidgetWithCustomImage({
loading,
bodyText,
footerText,
icon,
title,
}: WidgetProps) {
return (
<Widget>
<WidgetTitle
title={title}
icon={
typeof icon === 'string' ? (
<img
className="custom-header-ico space-right"
src={icon}
alt="header-icon"
/>
) : (
icon
)
}
/>
<WidgetBody loading={loading}>{bodyText}</WidgetBody>
<WidgetFooter>{footerText}</WidgetFooter>
</Widget>
);
}
WidgetWithCustomImage.args = {
icon: 'https://via.placeholder.com/150',
};
function WidgetWithTaskBar({
loading,
bodyText,
footerText,
icon,
title,
}: WidgetProps) {
return (
<Widget>
<WidgetTitle title={title} icon={icon} />
<WidgetTaskbar>
<button type="button" className="btn btn-primary">
Button
</button>
</WidgetTaskbar>
<WidgetBody loading={loading}>{bodyText}</WidgetBody>
<WidgetFooter>{footerText}</WidgetFooter>
</Widget>
);
}