@patreon/studio
Version:
Patreon Studio Design System
67 lines • 2.85 kB
JSX
'use client';
import React from 'react';
import { BodyText } from '~/components/BodyText';
import { Button } from '~/components/Button';
import { IconCheckmark, IconClose, IconNo } from '~/components/Icon';
import { LoadingSpinner } from '~/components/LoadingSpinner';
import { Spacer } from '~/components/Spacer';
import { TextLink } from '~/components/TextLink';
import { tokens } from '~/tokens';
import { ToastTextWrapper } from './styled-components';
function ToastCloseButton({ setState }) {
return (<Spacer mr={tokens.global.space.x8} aria-hidden>
<Button icon={IconClose} corners="pill" variant="secondary" unfilled data-tag="close-button" onClick={() => setState('leaving')}/>
</Spacer>);
}
function ToastWrapper({ children, action, showCloseButton, setState }) {
const { label: actionLabel, ...actionProps } = action ?? {};
return (<>
{children}
{action && (<Spacer mr={tokens.global.space.x16} aria-hidden>
<TextLink {...actionProps}>{actionLabel}</TextLink>
</Spacer>)}
{showCloseButton && <ToastCloseButton setState={setState}/>}
</>);
}
function FormattedChildren({ children }) {
// Automatically add the correct padding if the children is a simple string.
// This is mostly for backwards compatibility when previous versions of
// toasts only accepted strings for contents.
if (typeof children === 'string') {
return (<ToastTextWrapper>
<BodyText>{children}</BodyText>
</ToastTextWrapper>);
}
return <>{children}</>;
}
export function SuccessToast({ children, action, setState }) {
return (<ToastWrapper showCloseButton action={action} setState={setState}>
<Spacer ml={tokens.global.space.x16}>
<IconCheckmark color={tokens.global.success.surface.default} size="16px"/>
</Spacer>
<FormattedChildren>{children}</FormattedChildren>
</ToastWrapper>);
}
export function ErrorToast({ children, action, setState }) {
return (<ToastWrapper showCloseButton action={action} setState={setState}>
<Spacer ml={tokens.global.space.x16}>
<IconNo size="16px" color={tokens.global.critical.surface.default}/>
</Spacer>
<FormattedChildren>{children}</FormattedChildren>
</ToastWrapper>);
}
export function LoadingToast({ children, action, setState }) {
return (<ToastWrapper action={action} setState={setState}>
<Spacer ml={tokens.global.space.x16}>
<LoadingSpinner data-tag="loading-spinner" size="xs"/>
</Spacer>
<FormattedChildren>{children}</FormattedChildren>
</ToastWrapper>);
}
export function CustomToast({ children, showCloseButton, setState }) {
return (<>
<FormattedChildren>{children}</FormattedChildren>
{showCloseButton && <ToastCloseButton setState={setState}/>}
</>);
}
//# sourceMappingURL=variants.jsx.map