@veracity/vui
Version:
Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.
203 lines (193 loc) • 6.45 kB
JavaScript
import styled from "../core/styled.js";
import { Icon } from "../icon/icon.js";
import { DismissButton } from "../dismissButton/DismissButton.js";
import { Spinner } from "../spinner/spinner.js";
import { intentStyle } from "./theme.js";
import { memo } from "react";
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
//#region src/toast/ToastItem.tsx
const intentIcon = {
info: "uiInfoCircle",
success: "uiCheckCircle",
warning: "uiExclamationTriangle",
danger: "uiExclamationCircle"
};
const TOAST_ICON_SIZE = 16;
const toastTypography = `
--vui-toast-text-size: var(--vui-font-size-sm, 14px);
--vui-toast-text-weight: var(--vui-caption-font-weight, 400);
--vui-toast-text-line-height: var(--vui-caption-line-height, 150%);
font-size: var(--vui-toast-text-size);
font-weight: var(--vui-toast-text-weight);
line-height: var(--vui-toast-text-line-height);
`;
const toastTitleTypography = `
--vui-toast-title-weight: var(--vui-caption-font-weight-bold, 600);
font-weight: var(--vui-toast-title-weight);
`;
const ToastRoot = styled.div`
${`
--vui-toast-gap-row: 16px;
--vui-toast-gap-text: 0px;
--vui-toast-gap-action-bar: 8px;
--vui-toast-padding-row: 8px 16px;
--vui-toast-padding-icon: 8px 0 0;
--vui-toast-padding-text: 4px 0;
--vui-toast-padding-action-bar: 8px 16px;
--vui-toast-min-height: 56px;
--vui-toast-min-width: 320px;
--vui-toast-width-default: 480px;
--vui-toast-width-wide: 560px;
--vui-toast-text-clamp: 2;
--vui-toast-title-line-height: 24px;
--vui-toast-shadow:
0px 0px 1px 0px rgba(0, 0, 0, 0.05),
0px 10px 20px 0px rgba(0, 0, 0, 0.15);
--vui-toast-animation-duration: 0.2s;
--vui-toast-animation-timing: ease-in-out;
`}
animation: vui-fadeDown var(--vui-toast-animation-duration) var(--vui-toast-animation-timing);
box-shadow: var(--vui-toast-shadow);
box-sizing: border-box;
display: flex;
flex-direction: column;
min-height: var(--vui-toast-min-height);
min-width: var(--vui-toast-min-width);
width: ${({ $size }) => $size === "wide" ? "var(--vui-toast-width-wide)" : "var(--vui-toast-width-default)"};
${({ $status }) => intentStyle[$status]}
`;
const Row = styled.div`
align-items: stretch;
display: flex;
flex-direction: row;
gap: var(--vui-toast-gap-row);
padding: var(--vui-toast-padding-row);
`;
const IconWrap = styled.div`
align-self: ${({ $inline }) => $inline ? "center" : "flex-start"};
color: var(--vui-toast-intent-color);
display: flex;
flex-shrink: 0;
padding: ${({ $inline }) => $inline ? "0" : "var(--vui-toast-padding-icon)"};
`;
const TextArea = styled.div`
${toastTypography}
display: ${({ $inline }) => $inline ? "block" : "flex"};
flex: 1;
flex-direction: column;
gap: var(--vui-toast-gap-text);
min-width: 0;
padding: var(--vui-toast-padding-text);
`;
const InlineClamp = styled.span`
-webkit-box-orient: vertical;
-webkit-line-clamp: var(--vui-toast-text-clamp);
color: var(--vui-toast-intent-color);
display: -webkit-box;
overflow: hidden;
word-break: break-word;
`;
const Title = styled.p`
${toastTitleTypography}
color: var(--vui-toast-intent-color);
display: ${({ $inline }) => $inline ? "inline" : "block"};
line-height: var(--vui-toast-title-line-height);
margin: 0;
`;
const Description = styled.p`
-webkit-box-orient: vertical;
-webkit-line-clamp: var(--vui-toast-text-clamp);
color: var(--vui-toast-intent-color);
display: ${({ $inline }) => $inline ? "inline" : "-webkit-box"};
margin: 0;
overflow: hidden;
`;
const DismissWrap = styled.div`
--vui-dismiss-fg: var(--vui-toast-intent-color);
align-items: flex-start;
align-self: ${({ $inline }) => $inline ? "center" : "flex-start"};
display: flex;
flex-shrink: 0;
`;
const ActionBar = styled.div`
align-items: center;
background-color: var(--vui-background-default, white);
box-sizing: border-box;
display: flex;
gap: var(--vui-toast-gap-action-bar);
justify-content: flex-end;
padding: var(--vui-toast-padding-action-bar);
width: 100%;
`;
const ContentBar = styled.div`
background-color: var(--vui-toast-content-bg, var(--vui-background-default, white));
box-sizing: border-box;
display: flex;
gap: var(--vui-toast-gap-action-bar);
padding: var(--vui-toast-padding-action-bar);
width: 100%;
`;
const resolveToastIcon = (icon, status) => {
if (icon !== void 0 && icon !== "") return typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, {
name: icon,
h: TOAST_ICON_SIZE,
w: TOAST_ICON_SIZE
}) : icon;
if (status === "loading") return /* @__PURE__ */ jsx(Spinner, {
size: "xxs",
p: 0
});
return /* @__PURE__ */ jsx(Icon, {
name: intentIcon[status] ?? "uiExclamationCircle",
h: TOAST_ICON_SIZE,
w: TOAST_ICON_SIZE
});
};
const ToastItemInner = ({ action, content, icon, onClose, showDismissButton = true, size = "default", status = "info", text, textLayout = "stacked", title }) => {
const isInline = textLayout === "inline";
const resolvedIcon = resolveToastIcon(icon, status);
return /* @__PURE__ */ jsxs(ToastRoot, {
role: "status",
"aria-live": "polite",
$status: status,
$size: size,
children: [
/* @__PURE__ */ jsxs(Row, { children: [
/* @__PURE__ */ jsx(IconWrap, {
$inline: isInline,
children: resolvedIcon
}),
/* @__PURE__ */ jsx(TextArea, {
$inline: isInline,
children: isInline ? /* @__PURE__ */ jsxs(InlineClamp, { children: [
!!title && /* @__PURE__ */ jsx(Title, {
$inline: true,
children: title
}),
!!title && !!text && " ",
!!text && /* @__PURE__ */ jsx(Description, {
$inline: true,
children: text
})
] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [!!title && /* @__PURE__ */ jsx(Title, { children: title }), !!text && /* @__PURE__ */ jsx(Description, { children: text })] })
}),
showDismissButton && onClose && /* @__PURE__ */ jsx(DismissWrap, {
$inline: isInline,
children: /* @__PURE__ */ jsx(DismissButton, {
size: "md",
onClick: onClose,
"aria-label": "Close"
})
})
] }),
!!content && /* @__PURE__ */ jsx(ContentBar, { children: content }),
!!action && /* @__PURE__ */ jsx(ActionBar, { children: action })
]
});
};
const ToastItem = memo(ToastItemInner);
ToastItem.displayName = "ToastItem";
//#endregion
export { ToastItem };
globalThis.__vuiVersion__ = "5.3.1"
//# sourceMappingURL=ToastItem.js.map