@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
91 lines (90 loc) • 2.75 kB
JavaScript
// packages/editor/src/components/collaborators-presence/avatar/component.tsx
import clsx from "clsx";
import { colord, extend } from "colord";
import a11yPlugin from "colord/plugins/a11y";
import { Icon, Tooltip } from "@wordpress/components";
import { useMemo } from "@wordpress/element";
import { useImageLoadingStatus } from "./use-image-loading-status.mjs";
import { jsx, jsxs } from "react/jsx-runtime";
extend([a11yPlugin]);
var GRAY_900 = "#1e1e1e";
var WHITE = "#fff";
function Avatar({
className,
src,
name,
label,
variant,
size = "default",
borderColor,
dimmed = false,
statusIndicator,
style,
...props
}) {
const {
status: imageStatus,
handleLoad,
handleError
} = useImageLoadingStatus(src);
const imageLoaded = imageStatus === "loaded";
const showBadge = variant === "badge" && !!name;
const initials = name ? name.split(/\s+/).slice(0, 2).map((word) => word[0]).join("").toUpperCase() : void 0;
const nameColor = useMemo(
() => borderColor && colord(borderColor).isReadable(GRAY_900, {
level: "AA",
size: "normal"
}) ? GRAY_900 : WHITE,
[borderColor]
);
const customProperties = {
...style,
...borderColor ? {
"--editor-avatar-outline-color": borderColor,
"--editor-avatar-name-color": nameColor
} : {}
};
const avatar = /* @__PURE__ */ jsxs(
"div",
{
className: clsx("editor-avatar", className, {
"has-avatar-border-color": !!borderColor,
"has-src": imageLoaded,
"is-badge": showBadge,
"is-small": size === "small",
"is-dimmed": dimmed
}),
style: customProperties,
role: name ? "img" : void 0,
"aria-label": name || void 0,
...props,
children: [
/* @__PURE__ */ jsxs("span", { className: "editor-avatar__image", children: [
src && /* @__PURE__ */ jsx(
"img",
{
src,
alt: "",
crossOrigin: "anonymous",
className: "editor-avatar__img",
onLoad: handleLoad,
onError: handleError
}
),
!imageLoaded && initials
] }),
dimmed && !!statusIndicator && /* @__PURE__ */ jsx("span", { className: "editor-avatar__status-indicator", children: /* @__PURE__ */ jsx(Icon, { icon: statusIndicator }) }),
showBadge && /* @__PURE__ */ jsx("span", { className: "editor-avatar__name", children: label || name })
]
}
);
if (name && (!showBadge || label)) {
return /* @__PURE__ */ jsx(Tooltip, { text: name, children: avatar });
}
return avatar;
}
var component_default = Avatar;
export {
component_default as default
};
//# sourceMappingURL=component.mjs.map