From 909af227d11475d2a1cfbf649f83f92247e6c29c Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso Date: Mon, 15 Sep 2025 12:17:40 +0200 Subject: [PATCH 01/22] First Draft of Avatar component --- apps/website/pages/components/avatar/code.tsx | 17 ++ .../website/pages/components/avatar/index.tsx | 15 ++ .../screens/common/componentsList.json | 5 + .../components/avatar/AvatarPageLayout.tsx | 27 +++ .../components/avatar/code/AvatarCodePage.tsx | 152 +++++++++++++++++ .../avatar/code/examples/basicUsage.tsx | 19 +++ .../avatar/code/examples/clickable.tsx | 19 +++ .../components/avatar/code/examples/color.tsx | 18 ++ .../avatar/code/examples/status.tsx | 19 +++ .../avatar/code/examples/tooltip.tsx | 19 +++ .../avatar/overview/AvatarOverviewPage.tsx | 21 +++ .../src/avatar/Avatar.accessibility.test.tsx | 17 ++ packages/lib/src/avatar/Avatar.stories.tsx | 133 +++++++++++++++ packages/lib/src/avatar/Avatar.test.tsx | 93 ++++++++++ packages/lib/src/avatar/Avatar.tsx | 159 ++++++++++++++++++ packages/lib/src/avatar/types.ts | 62 +++++++ packages/lib/src/avatar/utils.ts | 156 +++++++++++++++++ packages/lib/src/index.ts | 1 + 18 files changed, 952 insertions(+) create mode 100644 apps/website/pages/components/avatar/code.tsx create mode 100644 apps/website/pages/components/avatar/index.tsx create mode 100644 apps/website/screens/components/avatar/AvatarPageLayout.tsx create mode 100644 apps/website/screens/components/avatar/code/AvatarCodePage.tsx create mode 100644 apps/website/screens/components/avatar/code/examples/basicUsage.tsx create mode 100644 apps/website/screens/components/avatar/code/examples/clickable.tsx create mode 100644 apps/website/screens/components/avatar/code/examples/color.tsx create mode 100644 apps/website/screens/components/avatar/code/examples/status.tsx create mode 100644 apps/website/screens/components/avatar/code/examples/tooltip.tsx create mode 100644 apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx create mode 100644 packages/lib/src/avatar/Avatar.accessibility.test.tsx create mode 100644 packages/lib/src/avatar/Avatar.stories.tsx create mode 100644 packages/lib/src/avatar/Avatar.test.tsx create mode 100644 packages/lib/src/avatar/Avatar.tsx create mode 100644 packages/lib/src/avatar/types.ts create mode 100644 packages/lib/src/avatar/utils.ts diff --git a/apps/website/pages/components/avatar/code.tsx b/apps/website/pages/components/avatar/code.tsx new file mode 100644 index 000000000..7bee7fbb8 --- /dev/null +++ b/apps/website/pages/components/avatar/code.tsx @@ -0,0 +1,17 @@ +import Head from "next/head"; +import { ReactElement } from "react-markdown/lib/react-markdown"; +import AvatarPageLayout from "screens/components/avatar/AvatarPageLayout"; +import AvatarCodePage from "screens/components/avatar/code/AvatarCodePage"; + +const Code = () => ( + <> + + Avatar code - Halstack Design + + + +); + +Code.getLayout = (page: ReactElement) => {page}; + +export default Code; diff --git a/apps/website/pages/components/avatar/index.tsx b/apps/website/pages/components/avatar/index.tsx new file mode 100644 index 000000000..b4da0c955 --- /dev/null +++ b/apps/website/pages/components/avatar/index.tsx @@ -0,0 +1,15 @@ +import Head from "next/head"; +import { ReactElement } from "react-markdown/lib/react-markdown"; +import AvatarPageLayout from "screens/components/avatar/AvatarPageLayout"; +import AvatarOverviewPage from "screens/components/avatar/overview/AvatarOverviewPage"; + +const Index = () => { + <> + Avatar - Halstack Design System + + ; +}; + +Index.getLayout = (page: ReactElement) => {page} + +export default Index; diff --git a/apps/website/screens/common/componentsList.json b/apps/website/screens/common/componentsList.json index 6037d4c84..48a94562c 100644 --- a/apps/website/screens/common/componentsList.json +++ b/apps/website/screens/common/componentsList.json @@ -6,6 +6,11 @@ "path": "/components/application-layout", "status": "stable" }, + { + "label": "Avatar", + "path": "/components/avatar", + "status": "experimental" + }, { "label": "Badge", "path": "/components/badge", diff --git a/apps/website/screens/components/avatar/AvatarPageLayout.tsx b/apps/website/screens/components/avatar/AvatarPageLayout.tsx new file mode 100644 index 000000000..86990ed5c --- /dev/null +++ b/apps/website/screens/components/avatar/AvatarPageLayout.tsx @@ -0,0 +1,27 @@ +import ComponentHeading from "@/common/ComponentHeading"; +import PageHeading from "@/common/PageHeading"; +import TabsPageHeading from "@/common/TabsPageLayout"; +import { DxcFlex, DxcParagraph } from "@dxc-technology/halstack-react"; +import { ReactNode } from "react"; + +const AvatarPageHeading = ({ children }: { children: ReactNode }) => { + const tabs = [ + { label: "Overview", path: "/components/avatar" }, + { label: "Code", path: "/components/avatar/code" }, + ]; + + return ( + + + + + The avatar component... + + + + {children} + + ); +}; + +export default AvatarPageHeading; diff --git a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx new file mode 100644 index 000000000..db4398cb7 --- /dev/null +++ b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx @@ -0,0 +1,152 @@ +import { TableCode } from "@/common/Code"; +import Example from "@/common/example/Example"; +import DxcQuickNavContainer from "@/common/QuickNavContainer"; +import { DxcFlex, DxcTable } from "@dxc-technology/halstack-react"; +import DocFooter from "@/common/DocFooter"; +import basicUsage from "./examples/basicUsage"; +import color from "./examples/color"; +import clickable from "./examples/clickable"; +import tooltip from "./examples/tooltip"; +import status from "./examples/status"; + +const sections = [ + { + title: "Props", + content: ( + + + + Name + Type + Description + Default + + + + + color + + 'grey' | 'blue' | 'green' | 'orange' | 'red' | 'yellow' | 'purple' + + Affects the visual style of the badge. It can be used following semantic purposes or not. + 'grey' + + + icon + + string | SVG + + Material Symbol name or SVG element as the icon that will be placed as avatar. + 'person' + + + imageSrc + + string + + URL of the image. + - + + + label + + string + + Full name of the user. Used to generate and display initials inside the avatar. + - + + + linkHref + + string + + If defined, the avatar will be displayed as an anchor, using this prop as "href". + - + + + onClick + + {"() => void"} + + + This function will be called when the user clicks the avatar. This will enable all the button states, if + not passed it will be treated as a readonly element. + + - + + + shape + + 'circle' | 'square' + + This will determine if the avatar will be a rounded square or a circle. + 'circle' + + + size + + 'small' | 'medium' | 'large' + + Size of the component. + 'medium' + + + Status + {"mode: 'default' | 'info' | 'success' | 'warning' | 'error'; position: 'top' | 'bottom';"} + + Defines the color of the status indicator displayed on the avatar and where it will be placed. If not + provided, no indicator will be rendered. + + - + + + tabIndex + + number + + Value of the tabindex attribute. It will only apply when the onClick property is passed. + 0 + + + title + + string + + Text to be displayed inside a tooltip when hovering the avatar. + - + + + + ), + }, + { + title: "Examples", + subSections: [ + { + title: "Basic usage", + content: , + }, + { + title: "Clickable", + content: , + }, + { + title: "Status", + content: , + }, + { + title: "Tooltip", + content: , + }, + ], + }, +]; + +const AvatarCodePage = () => ( + + + + +); + +export default AvatarCodePage; diff --git a/apps/website/screens/components/avatar/code/examples/basicUsage.tsx b/apps/website/screens/components/avatar/code/examples/basicUsage.tsx new file mode 100644 index 000000000..466b9b8ab --- /dev/null +++ b/apps/website/screens/components/avatar/code/examples/basicUsage.tsx @@ -0,0 +1,19 @@ +import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; + +const code = `() => { + return ( + + + + ); +}`; + +const scope = { + DxcAvatar, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/avatar/code/examples/clickable.tsx b/apps/website/screens/components/avatar/code/examples/clickable.tsx new file mode 100644 index 000000000..13f048ad5 --- /dev/null +++ b/apps/website/screens/components/avatar/code/examples/clickable.tsx @@ -0,0 +1,19 @@ +import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; + +const code = `() => { + return ( + + console.log("Hello")} + /> + + ); +}`; + +const scope = { + DxcAvatar, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/avatar/code/examples/color.tsx b/apps/website/screens/components/avatar/code/examples/color.tsx new file mode 100644 index 000000000..b5b1d9e54 --- /dev/null +++ b/apps/website/screens/components/avatar/code/examples/color.tsx @@ -0,0 +1,18 @@ +import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; + +const code = `() => { + return ( + + + + ); +}`; + +const scope = { + DxcAvatar, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/avatar/code/examples/status.tsx b/apps/website/screens/components/avatar/code/examples/status.tsx new file mode 100644 index 000000000..fce223ee3 --- /dev/null +++ b/apps/website/screens/components/avatar/code/examples/status.tsx @@ -0,0 +1,19 @@ +import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; + +const code = `() => { + return ( + + + + ); +}`; + +const scope = { + DxcAvatar, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/avatar/code/examples/tooltip.tsx b/apps/website/screens/components/avatar/code/examples/tooltip.tsx new file mode 100644 index 000000000..6f165b3d9 --- /dev/null +++ b/apps/website/screens/components/avatar/code/examples/tooltip.tsx @@ -0,0 +1,19 @@ +import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; + +const code = `() => { + return ( + + + + ); +}`; + +const scope = { + DxcAvatar, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx new file mode 100644 index 000000000..f4ec672b0 --- /dev/null +++ b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx @@ -0,0 +1,21 @@ +import DocFooter from "@/common/DocFooter"; +import DxcQuickNavContainer from "@/common/QuickNavContainer"; +import { DxcFlex, DxcParagraph } from "@dxc-technology/halstack-react"; + +const sections = [ + { + title: "Introduction", + content: Halstack's Avatar component is designed to..., + }, +]; + +const AvatarOverviewPage = () => { + return ( + + + + + ); +}; + +export default AvatarOverviewPage; diff --git a/packages/lib/src/avatar/Avatar.accessibility.test.tsx b/packages/lib/src/avatar/Avatar.accessibility.test.tsx new file mode 100644 index 000000000..df4515909 --- /dev/null +++ b/packages/lib/src/avatar/Avatar.accessibility.test.tsx @@ -0,0 +1,17 @@ +import { render } from "@testing-library/react"; +import DxcAvatar from "./Avatar"; +import { axe } from "../../test/accessibility/axe-helper"; + +(global as any).ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} +}; + +describe("Avatar component accessibility tests", () => { + it("Should not have basic accessibility issues", async () => { + const { container } = render(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); +}); diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx new file mode 100644 index 000000000..8738217b9 --- /dev/null +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -0,0 +1,133 @@ +import { Meta, StoryObj } from "@storybook/react"; +import ExampleContainer from "../../.storybook/components/ExampleContainer"; +import Title from "../../.storybook/components/Title"; +import DxcAvatar from "./Avatar"; +import DxcFlex from "../flex/Flex"; + +export default { + title: "Avatar", + component: DxcAvatar, +} as Meta; + +const Avatar = () => ( + <> + + <DxcFlex alignItems="end"> + <ExampleContainer> + <DxcAvatar size="xsmall" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="small" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="medium" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="large" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xlarge" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" /> + </ExampleContainer> + </DxcFlex> + <Title title="Colors" theme="light" level={2} /> + <DxcFlex> + <ExampleContainer> + <DxcAvatar size="xxlarge" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="blue" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="green" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="orange" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="red" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="yellow" /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" color="purple" /> + </ExampleContainer> + </DxcFlex> + <Title title="Square" theme="light" level={2} /> + <ExampleContainer> + <DxcAvatar size="xxlarge" shape="square" /> + </ExampleContainer> + <Title title="Image" theme="light" level={2} /> + <ExampleContainer> + <DxcAvatar size="xxlarge" imageSrc="https://picsum.photos/id/1022/200/300" /> + </ExampleContainer> + <Title title="Initials" theme="light" level={2} /> + <ExampleContainer> + <DxcAvatar size="xxlarge" label="John Doe" /> + </ExampleContainer> + <Title title="Custon Icon" theme="light" level={2} /> + <ExampleContainer> + <DxcAvatar size="xxlarge" icon="filled_shield" /> + </ExampleContainer> + <Title title="With tooltip" theme="light" level={2} /> + <ExampleContainer> + <DxcAvatar size="xxlarge" title="John Doe" /> + </ExampleContainer> + <Title title="Status" theme="light" level={2} /> + <DxcFlex> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "default", position: "top" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "info", position: "top" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "success", position: "top" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "warning", position: "top" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "error", position: "top" }} /> + </ExampleContainer> + </DxcFlex> + <DxcFlex> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "default", position: "bottom" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "info", position: "bottom" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "success", position: "bottom" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "warning", position: "bottom" }} /> + </ExampleContainer> + <ExampleContainer> + <DxcAvatar size="xxlarge" status={{ mode: "error", position: "bottom" }} /> + </ExampleContainer> + </DxcFlex> + <Title title="Hover" theme="light" level={2} /> + <ExampleContainer pseudoState="pseudo-hover"> + <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + </ExampleContainer> + <Title title="Focus" theme="light" level={2} /> + <ExampleContainer pseudoState="pseudo-focus"> + <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + </ExampleContainer> + <Title title="Active" theme="light" level={2} /> + <ExampleContainer pseudoState="pseudo-active"> + <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + </ExampleContainer> + </> +); + +type Story = StoryObj<typeof DxcAvatar>; + +export const Chromatic: Story = { + render: Avatar, +}; diff --git a/packages/lib/src/avatar/Avatar.test.tsx b/packages/lib/src/avatar/Avatar.test.tsx new file mode 100644 index 000000000..1599f5674 --- /dev/null +++ b/packages/lib/src/avatar/Avatar.test.tsx @@ -0,0 +1,93 @@ +import "@testing-library/jest-dom"; +import { fireEvent, render } from "@testing-library/react"; +import DxcAvatar from "./Avatar"; + +(global as any).ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} +}; + +describe("Avatar component tests", () => { + test("Avatar renders correctly", () => { + const { getByRole } = render(<DxcAvatar />); + const avatar = getByRole("img", { hidden: true }); + expect(avatar).toBeInTheDocument(); + }); + test("Avatar renders with custom icon when icon is a SVG", () => { + const CustomIcon = () => <svg data-testid="custom-icon"></svg>; + const { getByTestId } = render(<DxcAvatar icon={<CustomIcon />} />); + const icon = getByTestId("custom-icon"); + expect(icon).toBeInTheDocument(); + }); + test("Avatar renders with image when src is passed", () => { + const { getByRole } = render(<DxcAvatar imageSrc="https://example.com/avatar.png" />); + const img = getByRole("img"); + expect(img).toHaveAttribute("src", "https://example.com/avatar.png"); + }); + test("Avatar renders with initials when initials is passed", () => { + const { getByText } = render(<DxcAvatar label="John Doe" />); + const initials = getByText("JD"); + expect(initials).toBeInTheDocument(); + }); + test("Avatar renders with initials when src is invalid and initials is passed", () => { + const { getByRole, getByText, queryByText } = render(<DxcAvatar imageSrc="invalid-url" label="John Doe" />); + const img = getByRole("img"); + expect(img).toBeInTheDocument(); + expect(queryByText("JD")).not.toBeInTheDocument(); + fireEvent.error(img); + const initials = getByText("JD"); + expect(initials).toBeInTheDocument(); + expect(img).not.toBeInTheDocument(); + }); + test("Avatar renders with image when src and initials are passed", () => { + const { getByRole, queryByText } = render( + <DxcAvatar + imageSrc="https://developer.dxc.com/halstack/next/_next/static/media/neutral_colors.e92a8be2.png" + label="John Doe" + /> + ); + const img = getByRole("img"); + expect(img).toBeInTheDocument(); + const initials = queryByText("JD"); + expect(initials).not.toBeInTheDocument(); + }); + test("Avatar renders as a link when linkHref is passed", () => { + const { getByRole } = render(<DxcAvatar linkHref="/components/avatar" />); + const link = getByRole("link"); + expect(link).toBeInTheDocument(); + expect(link).toHaveAttribute("href", "/components/avatar"); + }); + test("Avatar calls onClick when onClick is passed and component is clicked", () => { + const handleClick = jest.fn(); + const { getByRole } = render(<DxcAvatar onClick={handleClick} />); + const buttonDiv = getByRole("button"); + expect(buttonDiv).toBeInTheDocument(); + fireEvent.click(buttonDiv); + expect(handleClick).toHaveBeenCalledTimes(1); + }); + test("Avatar renders status indicator correctly", () => { + const { rerender, getByTestId, queryByTestId } = render( + <DxcAvatar label="John Doe" status={{ mode: "default", position: "top" }} /> + ); + expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-neutral-strong)"); + rerender(<DxcAvatar label="John Doe" status={{ mode: "info", position: "top" }} />); + expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-secondary-medium)"); + rerender(<DxcAvatar label="John Doe" status={{ mode: "success", position: "top" }} />); + expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-success-medium)"); + rerender(<DxcAvatar label="John Doe" status={{ mode: "warning", position: "top" }} />); + expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-warning-strong)"); + rerender(<DxcAvatar label="John Doe" status={{ mode: "error", position: "top" }} />); + expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-error-medium)"); + rerender(<DxcAvatar label="John Doe" />); + expect(queryByTestId("avatar-status")).toBeNull(); + }); + test("Avatar renders status indicator in correct position", () => { + const { rerender, getByTestId } = render( + <DxcAvatar label="John Doe" status={{ mode: "default", position: "top" }} /> + ); + expect(getByTestId("avatar-status")).toHaveStyle("top: 0px;"); + rerender(<DxcAvatar label="John Doe" status={{ mode: "info", position: "bottom" }} />); + expect(getByTestId("avatar-status")).toHaveStyle("bottom: 0px"); + }); +}); diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx new file mode 100644 index 000000000..231dfb6e3 --- /dev/null +++ b/packages/lib/src/avatar/Avatar.tsx @@ -0,0 +1,159 @@ +import { useState } from "react"; +import AvatarPropsType from "./types"; +import styled from "@emotion/styled"; +import DxcImage from "../image/Image"; +import DxcIcon from "../icon/Icon"; +import { TooltipWrapper } from "../tooltip/Tooltip"; +import { + getBackgroundColor, + getBorderRadius, + getBorderWidth, + getColor, + getFontSize, + getIconSize, + getInitials, + getModeColor, + getSize, +} from "./utils"; + +const AvatarContainer = styled.div<{ + hasAction?: boolean; + size: AvatarPropsType["size"]; + href?: string; +}>` + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: ${({ size }) => getSize(size)}; + aspect-ratio: 1 / 1; + text-decoration: none; + ${({ hasAction }) => + hasAction && + ` + cursor: pointer; + &:hover > div:first-child > div:first-child { + display: block; + } + &:focus > div:first-child { + outline: 2px solid var(--border-color-secondary-medium); + } + &:active > div:first-child { + outline: 2px solid var(--border-color-secondary-medium); + } + &:active > div:first-child > div:first-child { + display: block; + } + `} +`; + +const AvatarWrapper = styled.div<{ + shape: AvatarPropsType["shape"]; + color: AvatarPropsType["color"]; + size: AvatarPropsType["size"]; +}>` + position: relative; + height: 100%; + aspect-ratio: 1 / 1; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + background-color: ${({ color }) => getBackgroundColor(color)}; + color: ${({ color }) => getColor(color)}; + border-radius: ${({ shape, size }) => getBorderRadius(shape, size)}; +`; + +const Overlay = styled.div` + display: none; + position: absolute; + height: 100%; + width: 100%; + background-color: var(--color-alpha-400-a); +`; + +const Initials = styled.div<{ size: AvatarPropsType["size"] }>` + color: inherit; + font-family: var(--typography-font-family); + font-style: normal; + font-weight: var(--typography-label-semibold); + font-size: ${({ size }) => getFontSize(size)}; + line-height: normal; +`; + +const AvatarIcon = styled.div<{ color: AvatarPropsType["color"]; size: AvatarPropsType["size"] }>` + display: flex; + justify-content: center; + align-items: center; + line-height: 1; + font-size: ${({ size }) => getIconSize(size)}; +`; + +const StatusContainer = styled.div<{ + status: AvatarPropsType["status"]; + size: AvatarPropsType["size"]; +}>` + position: absolute; + right: 0px; + ${({ status }) => (status?.position === "top" ? "top: 0px;" : "bottom: 0px;")} + width: 25%; + height: 25%; + border: ${({ size }) => getBorderWidth(size)}; + border-color: var(--border-color-neutral-brighter); + border-radius: 100%; + background-color: ${({ status }) => getModeColor(status!.mode)}; +`; + +export default function DxcAvatar({ + color = "grey", + icon = "person", + imageSrc, + label, + linkHref, + onClick, + shape = "circle", + size = "medium", + status, + tabIndex = 0, + title, +}: AvatarPropsType) { + const [error, setError] = useState<boolean>(false); + const initials = getInitials(label); + + return ( + <TooltipWrapper condition={!!title} label={title}> + <AvatarContainer + size={size} + onClick={onClick} + hasAction={!!onClick || !!linkHref} + tabIndex={onClick || linkHref ? tabIndex : undefined} + role={onClick ? "button" : undefined} + as={linkHref ? "a" : undefined} + href={linkHref ? linkHref : undefined} + aria-label={label} + > + <AvatarWrapper shape={shape} color={color} size={size}> + <Overlay aria-hidden="true" /> + {imageSrc && !error ? ( + <DxcImage + src={imageSrc} + alt={label || "Avatar"} + onError={() => setError(true)} + width="100%" + height="100%" + objectFit="cover" + objectPosition="center" + /> + ) : initials.length > 0 ? ( + <Initials size={size}>{initials}</Initials> + ) : ( + <AvatarIcon size={size} color={color}> + {icon && (typeof icon === "string" ? <DxcIcon icon={icon} /> : icon)} + </AvatarIcon> + )} + </AvatarWrapper> + {status && <StatusContainer data-testid="avatar-status" size={size} status={status} />} + </AvatarContainer> + </TooltipWrapper> + ); +} diff --git a/packages/lib/src/avatar/types.ts b/packages/lib/src/avatar/types.ts new file mode 100644 index 000000000..9c00a4e9e --- /dev/null +++ b/packages/lib/src/avatar/types.ts @@ -0,0 +1,62 @@ +import { SVG } from "../common/utils"; + +export type Size = "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge"; +export type Shape = "circle" | "square"; +export type Color = "grey" | "blue" | "green" | "orange" | "red" | "yellow" | "purple"; +interface Status { + mode: "default" | "info" | "success" | "warning" | "error"; + position: "top" | "bottom"; +} + +type Props = { + /** + * Affects the visual style of the avatar. It can be used following semantic purposes or not. + */ + color?: Color; + /** + * Material Symbol name or SVG element as the icon that will be placed as avatar. + */ + icon?: string | SVG; + /** + * URL of the image. + */ + imageSrc?: string; + /** + * Full name of the user. + * Used to generate and display initials inside the avatar. + */ + label?: string; + /** + * If defined, the avatar will be displayed as an anchor, using this prop + * as "href". + */ + linkHref?: string; + /** + * This function will be called when the user clicks the avatar. This will enable all the button states, if + * not passed it will be treated as a readonly element. + */ + onClick?: () => void; + /** + * This will determine if the avatar will be rounded square or a circle. + */ + shape?: Shape; + /** + * Size of the component. + */ + size?: Size; + /** + * Defines the color of the status indicator displayed on the avatar and where it will be placed. + * If not provided, no indicator will be rendered. + */ + status?: Status; + /** + * Value of the tabindex attribute. It will only apply when the onClick property is passed. + */ + tabIndex?: number; + /** + * Text to be displayed inside a tooltip when hovering the avatar. + */ + title?: string; +}; + +export default Props; diff --git a/packages/lib/src/avatar/utils.ts b/packages/lib/src/avatar/utils.ts new file mode 100644 index 000000000..dd2dc7644 --- /dev/null +++ b/packages/lib/src/avatar/utils.ts @@ -0,0 +1,156 @@ +import AvatarPropsType from "./types"; + +const contextualColorMap = { + grey: { + background: "var(--color-bg-neutral-light)", + text: "var(--color-fg-neutral-strongest)", + }, + blue: { + background: "var(--color-bg-secondary-lighter)", + text: "var(--color-fg-secondary-stronger)", + }, + green: { + background: "var(--color-bg-success-lighter)", + text: "var(--color-fg-success-stronger)", + }, + orange: { + background: "var(--color-bg-warning-lighter)", + text: "var(--color-fg-warning-stronger)", + }, + red: { + background: "var(--color-bg-error-lighter)", + text: "var(--color-fg-error-stronger)", + }, + yellow: { + background: "var(--color-bg-yellow-light)", + text: "var(--color-fg-neutral-yellow-dark)", + }, + purple: { + background: "var(--color-bg-primary-lighter)", + text: "var(--color-fg-primary-stronger)", + }, +}; + +export const getColor = (color: AvatarPropsType["color"]) => (color ? contextualColorMap[color].text : undefined); +export const getBackgroundColor = (color: AvatarPropsType["color"]) => + color ? contextualColorMap[color].background : undefined; + +export const getBorderRadius = (shape: AvatarPropsType["shape"], size: AvatarPropsType["size"]) => { + if (shape === "circle") return "100%"; + + switch (size) { + case "xsmall": + return "var(--border-radius-xs)"; + case "small": + return "var(--border-radius-s)"; + case "medium": + return "var(--border-radius-m)"; + case "large": + return "var(--border-radius-m)"; + case "xlarge": + return "var(--border-radius-l)"; + case "xxlarge": + return "var(--border-radius-l)"; + default: + return "var(--border-radius-m)"; + } +}; + +export const getSize = (size: AvatarPropsType["size"]) => { + switch (size) { + case "xsmall": + return "var(--height-s)"; + case "small": + return "var(--height-m)"; + case "medium": + return "var(--height-xl)"; + case "large": + return "var(--height-xxxl)"; + case "xlarge": + return "72px"; + case "xxlarge": + return "80px"; + default: + return "var(--height-xl)"; + } +}; + +export const getFontSize = (size: AvatarPropsType["size"]) => { + switch (size) { + case "xsmall": + return "var(--typography-label-s)"; + case "small": + return "var(--typography-label-m)"; + case "medium": + return "var(--typography-label-l)"; + case "large": + return "var(--typography-label-xl)"; + case "xlarge": + return "32px"; + case "xxlarge": + return "36px"; + default: + return "var(--typography-label-l)"; + } +}; + +export const getIconSize = (size: AvatarPropsType["size"]) => { + switch (size) { + case "xsmall": + return "var(--height-xxs)"; + case "small": + return "var(--height-xs)"; + case "medium": + return "var(--height-s)"; + case "large": + return "var(--height-xl)"; + case "xlarge": + return "var(--height-xxl)"; + case "xxlarge": + return "52px"; + default: + return "var(--height-s)"; + } +}; + +export const getBorderWidth = (size: AvatarPropsType["size"]) => { + switch (size) { + case "xsmall": + case "small": + case "medium": + return "1px solid"; + case "large": + case "xlarge": + case "xxlarge": + return "2px solid"; + default: + return "1px solid"; + } +}; + +export const getModeColor = (mode: Required<AvatarPropsType>["status"]["mode"]) => { + switch (mode) { + case "default": + return "var(--color-fg-neutral-strong);"; + case "error": + return "var(--color-fg-error-medium)"; + case "info": + return "var(--color-fg-secondary-medium)"; + case "success": + return "var(--color-fg-success-medium)"; + case "warning": + return "var(--color-fg-warning-strong)"; + } +}; + +export const getInitials = (label?: string): string => { + if (!label) return ""; + const words = label.trim().split(/\s+/).filter(Boolean); + if (words.length >= 2) { + const firstChar = words[0]?.[0] ?? ""; + const secondChar = words[1]?.[0] ?? ""; + return (firstChar + secondChar).toUpperCase(); + } + const firstWord = words[0] ?? ""; + return firstWord.slice(0, 2).toUpperCase(); +}; diff --git a/packages/lib/src/index.ts b/packages/lib/src/index.ts index 57b9ab3fe..78c3eb941 100644 --- a/packages/lib/src/index.ts +++ b/packages/lib/src/index.ts @@ -4,6 +4,7 @@ import "./styles/variables.css"; export { default as DxcAccordion } from "./accordion/Accordion"; export { default as DxcAlert } from "./alert/Alert"; export { default as DxcApplicationLayout } from "./layout/ApplicationLayout"; +export { default as DxcAvatar } from "./avatar/Avatar"; export { default as DxcBadge } from "./badge/Badge"; export { default as DxcBleed } from "./bleed/Bleed"; export { default as DxcBreadcrumbs } from "./breadcrumbs/Breadcrumbs"; From 6bcb74efda4845e0e69af62564775bf85494aeb6 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Mon, 15 Sep 2025 12:56:28 +0200 Subject: [PATCH 02/22] Fix chromatic test fail with aria-label --- packages/lib/src/avatar/Avatar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 231dfb6e3..369b289ab 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -130,7 +130,7 @@ export default function DxcAvatar({ role={onClick ? "button" : undefined} as={linkHref ? "a" : undefined} href={linkHref ? linkHref : undefined} - aria-label={label} + aria-label={label || title || "Avatar"} > <AvatarWrapper shape={shape} color={color} size={size}> <Overlay aria-hidden="true" /> From 597c2a9e70a034618932db81932c123661c96041 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Mon, 15 Sep 2025 13:03:15 +0200 Subject: [PATCH 03/22] Fix aria-label when no role is assigned --- packages/lib/src/avatar/Avatar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 369b289ab..88e8bda74 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -130,7 +130,7 @@ export default function DxcAvatar({ role={onClick ? "button" : undefined} as={linkHref ? "a" : undefined} href={linkHref ? linkHref : undefined} - aria-label={label || title || "Avatar"} + aria-label={onClick && (label || title || "Avatar")} > <AvatarWrapper shape={shape} color={color} size={size}> <Overlay aria-hidden="true" /> From 14c34161be2fb4251aadfc091d4b66b479d3488e Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Tue, 16 Sep 2025 09:19:58 +0200 Subject: [PATCH 04/22] Fix based on review and add disabled prop functionality --- .../website/pages/components/avatar/index.tsx | 6 +- .../components/avatar/code/AvatarCodePage.tsx | 52 ++++-- .../components/avatar/code/examples/color.tsx | 18 -- .../avatar/overview/AvatarOverviewPage.tsx | 8 +- .../src/avatar/Avatar.accessibility.test.tsx | 31 +++- packages/lib/src/avatar/Avatar.stories.tsx | 4 + packages/lib/src/avatar/Avatar.test.tsx | 68 ++++++-- packages/lib/src/avatar/Avatar.tsx | 30 +++- packages/lib/src/avatar/types.ts | 18 +- packages/lib/src/avatar/utils.ts | 164 +++++++----------- 10 files changed, 219 insertions(+), 180 deletions(-) delete mode 100644 apps/website/screens/components/avatar/code/examples/color.tsx diff --git a/apps/website/pages/components/avatar/index.tsx b/apps/website/pages/components/avatar/index.tsx index b4da0c955..ad8b6213e 100644 --- a/apps/website/pages/components/avatar/index.tsx +++ b/apps/website/pages/components/avatar/index.tsx @@ -5,11 +5,13 @@ import AvatarOverviewPage from "screens/components/avatar/overview/AvatarOvervie const Index = () => { <> - <Head>Avatar - Halstack Design System</Head> + <Head> + <title>Avatar - Halstack Design System + ; }; -Index.getLayout = (page: ReactElement) => {page} +Index.getLayout = (page: ReactElement) => {page}; export default Index; diff --git a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx index db4398cb7..074199542 100644 --- a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx +++ b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx @@ -1,14 +1,19 @@ -import { TableCode } from "@/common/Code"; +import { ExtendedTableCode, TableCode } from "@/common/Code"; import Example from "@/common/example/Example"; import DxcQuickNavContainer from "@/common/QuickNavContainer"; import { DxcFlex, DxcTable } from "@dxc-technology/halstack-react"; import DocFooter from "@/common/DocFooter"; import basicUsage from "./examples/basicUsage"; -import color from "./examples/color"; import clickable from "./examples/clickable"; import tooltip from "./examples/tooltip"; import status from "./examples/status"; +const statusTypeString = `{ + mode: 'default' | 'info' | + 'success' | 'warning' | 'error'; + position: 'top' | 'bottom'; +}`; + const sections = [ { title: "Props", @@ -28,8 +33,16 @@ const sections = [ 'grey' | 'blue' | 'green' | 'orange' | 'red' | 'yellow' | 'purple' - Affects the visual style of the badge. It can be used following semantic purposes or not. - 'grey' + Affects the visual style of the avatar. It can be used following semantic purposes or not. + 'grey' + + + disabled + + boolean + + If true, the componente will be disabled. + false icon @@ -37,7 +50,9 @@ const sections = [ string | SVG Material Symbol name or SVG element as the icon that will be placed as avatar. - 'person' + + 'person' + imageSrc @@ -52,7 +67,7 @@ const sections = [ string - Full name of the user. Used to generate and display initials inside the avatar. + Text label associated with the avatar. Used to generate and display initials inside the avatar. - @@ -60,7 +75,7 @@ const sections = [ string - If defined, the avatar will be displayed as an anchor, using this prop as "href". + Page to be opened when the user clicks on the link. - @@ -68,10 +83,7 @@ const sections = [ {"() => void"} - - This function will be called when the user clicks the avatar. This will enable all the button states, if - not passed it will be treated as a readonly element. - + This function will be called when the user clicks the avatar. Makes it behave as a button. - @@ -80,7 +92,9 @@ const sections = [ 'circle' | 'square' This will determine if the avatar will be a rounded square or a circle. - 'circle' + + 'circle' + size @@ -88,11 +102,15 @@ const sections = [ 'small' | 'medium' | 'large' Size of the component. - 'medium' + + 'medium' + - Status - {"mode: 'default' | 'info' | 'success' | 'warning' | 'error'; position: 'top' | 'bottom';"} + status + + {statusTypeString} + Defines the color of the status indicator displayed on the avatar and where it will be placed. If not provided, no indicator will be rendered. @@ -105,7 +123,9 @@ const sections = [ number Value of the tabindex attribute. It will only apply when the onClick property is passed. - 0 + + 0 + title diff --git a/apps/website/screens/components/avatar/code/examples/color.tsx b/apps/website/screens/components/avatar/code/examples/color.tsx deleted file mode 100644 index b5b1d9e54..000000000 --- a/apps/website/screens/components/avatar/code/examples/color.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { DxcAvatar, DxcInset } from "@dxc-technology/halstack-react"; - -const code = `() => { - return ( - - - - ); -}`; - -const scope = { - DxcAvatar, - DxcInset, -}; - -export default { code, scope }; diff --git a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx index f4ec672b0..782f0b5a0 100644 --- a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx +++ b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx @@ -9,13 +9,11 @@ const sections = [ }, ]; -const AvatarOverviewPage = () => { - return ( - +const AvatarOverviewPage = () => ( + - ); -}; +) export default AvatarOverviewPage; diff --git a/packages/lib/src/avatar/Avatar.accessibility.test.tsx b/packages/lib/src/avatar/Avatar.accessibility.test.tsx index df4515909..0bbf43612 100644 --- a/packages/lib/src/avatar/Avatar.accessibility.test.tsx +++ b/packages/lib/src/avatar/Avatar.accessibility.test.tsx @@ -2,16 +2,35 @@ import { render } from "@testing-library/react"; import DxcAvatar from "./Avatar"; import { axe } from "../../test/accessibility/axe-helper"; -(global as any).ResizeObserver = class ResizeObserver { - observe() {} - unobserve() {} - disconnect() {} -}; - describe("Avatar component accessibility tests", () => { it("Should not have basic accessibility issues", async () => { const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); }); + it("Should not have basic accessibility issues when it works as a button", async () => { + const { container } = render( console.log("")} />); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + it("Should not have basic accessibility issues when it works as an anchor", async () => { + const { container } = render(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + it("Should not have basic accessibility issues when disabled", async () => { + const { container } = render(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + it("Should not have basic accessibility issues when status is passed", async () => { + const { container } = render(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + it("Should not have basic accessibility issues when image is passed", async () => { + const { container } = render(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); }); diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 8738217b9..29dc029c1 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -123,6 +123,10 @@ const Avatar = () => ( console.log()} /> + + <ExampleContainer> + <DxcAvatar size="xxlarge" onClick={() => console.log()} disabled /> + </ExampleContainer> </> ); diff --git a/packages/lib/src/avatar/Avatar.test.tsx b/packages/lib/src/avatar/Avatar.test.tsx index 1599f5674..f1b315877 100644 --- a/packages/lib/src/avatar/Avatar.test.tsx +++ b/packages/lib/src/avatar/Avatar.test.tsx @@ -1,5 +1,5 @@ import "@testing-library/jest-dom"; -import { fireEvent, render } from "@testing-library/react"; +import { fireEvent, queryByTestId, render } from "@testing-library/react"; import DxcAvatar from "./Avatar"; (global as any).ResizeObserver = class ResizeObserver { @@ -15,22 +15,27 @@ describe("Avatar component tests", () => { expect(avatar).toBeInTheDocument(); }); test("Avatar renders with custom icon when icon is a SVG", () => { - const CustomIcon = () => <svg data-testid="custom-icon"></svg>; + const CustomIcon = () => <svg data-testid="custom-icon" />; const { getByTestId } = render(<DxcAvatar icon={<CustomIcon />} />); const icon = getByTestId("custom-icon"); expect(icon).toBeInTheDocument(); }); test("Avatar renders with image when src is passed", () => { - const { getByRole } = render(<DxcAvatar imageSrc="https://example.com/avatar.png" />); + const { getByRole } = render( + <DxcAvatar imageSrc="https://developer.dxc.com/halstack/next/_next/static/media/neutral_colors.e92a8be2.png" /> + ); const img = getByRole("img"); - expect(img).toHaveAttribute("src", "https://example.com/avatar.png"); + expect(img).toHaveAttribute( + "src", + "https://developer.dxc.com/halstack/next/_next/static/media/neutral_colors.e92a8be2.png" + ); }); - test("Avatar renders with initials when initials is passed", () => { + test("Avatar renders with initials when label is passed", () => { const { getByText } = render(<DxcAvatar label="John Doe" />); const initials = getByText("JD"); expect(initials).toBeInTheDocument(); }); - test("Avatar renders with initials when src is invalid and initials is passed", () => { + test("Avatar renders with initials when src is invalid and label is passed", () => { const { getByRole, getByText, queryByText } = render(<DxcAvatar imageSrc="invalid-url" label="John Doe" />); const img = getByRole("img"); expect(img).toBeInTheDocument(); @@ -40,7 +45,7 @@ describe("Avatar component tests", () => { expect(initials).toBeInTheDocument(); expect(img).not.toBeInTheDocument(); }); - test("Avatar renders with image when src and initials are passed", () => { + test("Avatar renders with image when src and label are passed", () => { const { getByRole, queryByText } = render( <DxcAvatar imageSrc="https://developer.dxc.com/halstack/next/_next/static/media/neutral_colors.e92a8be2.png" @@ -52,6 +57,35 @@ describe("Avatar component tests", () => { const initials = queryByText("JD"); expect(initials).not.toBeInTheDocument(); }); + test("Avatar content fallback renders correctly in all cases", () => { + const CustomIcon = () => <svg data-testid="custom-icon" />; + const { rerender, getByRole, getByText, getByTestId, queryByRole, queryByText, queryByTestId } = render( + <DxcAvatar + imageSrc="https://developer.dxc.com/halstack/next/_next/static/media/neutral_colors.e92a8be2.png" + label="John Doe" + icon={<CustomIcon />} + /> + ); + expect(getByRole("img")).toBeInTheDocument(); + expect(queryByText("JD")).not.toBeInTheDocument(); + expect(queryByTestId("custom-icon")).not.toBeInTheDocument(); + expect(queryByRole("img", { hidden: true, name: "" })).not.toBeInTheDocument(); + rerender(<DxcAvatar label="John Doe" icon={<CustomIcon />} />); + expect(queryByRole("img")).not.toBeInTheDocument(); + expect(getByText("JD")).toBeInTheDocument(); + expect(queryByTestId("custom-icon")).not.toBeInTheDocument(); + expect(queryByRole("img", { hidden: true, name: "" })).not.toBeInTheDocument(); + rerender(<DxcAvatar icon={<CustomIcon />} />); + expect(queryByRole("img")).not.toBeInTheDocument(); + expect(queryByText("JD")).not.toBeInTheDocument(); + expect(getByTestId("custom-icon")).toBeInTheDocument(); + expect(queryByRole("img", { hidden: true, name: "" })).not.toBeInTheDocument(); + rerender(<DxcAvatar />); + expect(queryByRole("img")).not.toBeInTheDocument(); + expect(queryByText("JD")).not.toBeInTheDocument(); + expect(queryByTestId("custom-icon")).not.toBeInTheDocument(); + expect(getByRole("img", { hidden: true, name: "" })).toBeInTheDocument(); + }); test("Avatar renders as a link when linkHref is passed", () => { const { getByRole } = render(<DxcAvatar linkHref="/components/avatar" />); const link = getByRole("link"); @@ -67,27 +101,27 @@ describe("Avatar component tests", () => { expect(handleClick).toHaveBeenCalledTimes(1); }); test("Avatar renders status indicator correctly", () => { - const { rerender, getByTestId, queryByTestId } = render( + const { rerender, queryByRole, getByRole } = render( <DxcAvatar label="John Doe" status={{ mode: "default", position: "top" }} /> ); - expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-neutral-strong)"); + expect(getByRole("status")).toHaveStyle("background-color: var(--color-fg-neutral-strong)"); rerender(<DxcAvatar label="John Doe" status={{ mode: "info", position: "top" }} />); - expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-secondary-medium)"); + expect(getByRole("status")).toHaveStyle("background-color: var(--color-fg-secondary-medium)"); rerender(<DxcAvatar label="John Doe" status={{ mode: "success", position: "top" }} />); - expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-success-medium)"); + expect(getByRole("status")).toHaveStyle("background-color: var(--color-fg-success-medium)"); rerender(<DxcAvatar label="John Doe" status={{ mode: "warning", position: "top" }} />); - expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-warning-strong)"); + expect(getByRole("status")).toHaveStyle("background-color: var(--color-fg-warning-strong)"); rerender(<DxcAvatar label="John Doe" status={{ mode: "error", position: "top" }} />); - expect(getByTestId("avatar-status")).toHaveStyle("background-color: var(--color-fg-error-medium)"); + expect(getByRole("status")).toHaveStyle("background-color: var(--color-fg-error-medium)"); rerender(<DxcAvatar label="John Doe" />); - expect(queryByTestId("avatar-status")).toBeNull(); + expect(queryByRole("status")).toBeNull(); }); test("Avatar renders status indicator in correct position", () => { - const { rerender, getByTestId } = render( + const { rerender, getByRole } = render( <DxcAvatar label="John Doe" status={{ mode: "default", position: "top" }} /> ); - expect(getByTestId("avatar-status")).toHaveStyle("top: 0px;"); + expect(getByRole("status")).toHaveStyle("top: 0px;"); rerender(<DxcAvatar label="John Doe" status={{ mode: "info", position: "bottom" }} />); - expect(getByTestId("avatar-status")).toHaveStyle("bottom: 0px"); + expect(getByRole("status")).toHaveStyle("bottom: 0px"); }); }); diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 88e8bda74..e66138e96 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -19,7 +19,8 @@ import { const AvatarContainer = styled.div<{ hasAction?: boolean; size: AvatarPropsType["size"]; - href?: string; + href?: AvatarPropsType["linkHref"]; + disabled?: AvatarPropsType["disabled"]; }>` position: relative; display: flex; @@ -28,8 +29,8 @@ const AvatarContainer = styled.div<{ height: ${({ size }) => getSize(size)}; aspect-ratio: 1 / 1; text-decoration: none; - ${({ hasAction }) => - hasAction && + ${({ hasAction, disabled }) => + !disabled && hasAction && ` cursor: pointer; &:hover > div:first-child > div:first-child { @@ -45,6 +46,15 @@ const AvatarContainer = styled.div<{ display: block; } `} + ${({ disabled }) => + disabled && + ` + cursor: not-allowed; + & > div:first-child > div:first-child { + display: block; + background-color: rgba(255, 255, 255, 0.50); + } + `} `; const AvatarWrapper = styled.div<{ @@ -106,6 +116,7 @@ const StatusContainer = styled.div<{ export default function DxcAvatar({ color = "grey", + disabled = false, icon = "person", imageSrc, label, @@ -124,20 +135,21 @@ export default function DxcAvatar({ <TooltipWrapper condition={!!title} label={title}> <AvatarContainer size={size} - onClick={onClick} + onClick={!disabled ? onClick : undefined} hasAction={!!onClick || !!linkHref} - tabIndex={onClick || linkHref ? tabIndex : undefined} + tabIndex={!disabled && (onClick || linkHref) ? tabIndex : undefined} role={onClick ? "button" : undefined} as={linkHref ? "a" : undefined} - href={linkHref ? linkHref : undefined} - aria-label={onClick && (label || title || "Avatar")} + href={!disabled && linkHref ? linkHref : undefined} + aria-label={(onClick || linkHref) && (label || title || "Avatar")} + disabled={disabled} > <AvatarWrapper shape={shape} color={color} size={size}> <Overlay aria-hidden="true" /> {imageSrc && !error ? ( <DxcImage src={imageSrc} - alt={label || "Avatar"} + alt={label || title || "Avatar"} onError={() => setError(true)} width="100%" height="100%" @@ -152,7 +164,7 @@ export default function DxcAvatar({ </AvatarIcon> )} </AvatarWrapper> - {status && <StatusContainer data-testid="avatar-status" size={size} status={status} />} + {status && <StatusContainer role="status" size={size} status={status} />} </AvatarContainer> </TooltipWrapper> ); diff --git a/packages/lib/src/avatar/types.ts b/packages/lib/src/avatar/types.ts index 9c00a4e9e..879e8d0ac 100644 --- a/packages/lib/src/avatar/types.ts +++ b/packages/lib/src/avatar/types.ts @@ -1,8 +1,8 @@ import { SVG } from "../common/utils"; -export type Size = "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge"; -export type Shape = "circle" | "square"; -export type Color = "grey" | "blue" | "green" | "orange" | "red" | "yellow" | "purple"; +type Size = "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge"; +type Shape = "circle" | "square"; +type Color = "grey" | "blue" | "green" | "orange" | "red" | "yellow" | "purple"; interface Status { mode: "default" | "info" | "success" | "warning" | "error"; position: "top" | "bottom"; @@ -13,6 +13,10 @@ type Props = { * Affects the visual style of the avatar. It can be used following semantic purposes or not. */ color?: Color; + /** + * If true, the component will be disabled. + */ + disabled?: boolean; /** * Material Symbol name or SVG element as the icon that will be placed as avatar. */ @@ -22,18 +26,16 @@ type Props = { */ imageSrc?: string; /** - * Full name of the user. + * Text label associated with the avatar. * Used to generate and display initials inside the avatar. */ label?: string; /** - * If defined, the avatar will be displayed as an anchor, using this prop - * as "href". + * Page to be opened when the user clicks on the link. */ linkHref?: string; /** - * This function will be called when the user clicks the avatar. This will enable all the button states, if - * not passed it will be treated as a readonly element. + * This function will be called when the user clicks the avatar. Makes it behave as a button. */ onClick?: () => void; /** diff --git a/packages/lib/src/avatar/utils.ts b/packages/lib/src/avatar/utils.ts index dd2dc7644..f0f5e9df8 100644 --- a/packages/lib/src/avatar/utils.ts +++ b/packages/lib/src/avatar/utils.ts @@ -31,121 +31,87 @@ const contextualColorMap = { }, }; -export const getColor = (color: AvatarPropsType["color"]) => (color ? contextualColorMap[color].text : undefined); -export const getBackgroundColor = (color: AvatarPropsType["color"]) => - color ? contextualColorMap[color].background : undefined; - -export const getBorderRadius = (shape: AvatarPropsType["shape"], size: AvatarPropsType["size"]) => { - if (shape === "circle") return "100%"; +const borderRadiusMap = { + xsmall: "var(--border-radius-xs)", + small: "var(--border-radius-s)", + medium: "var(--border-radius-m)", + large: "var(--border-radius-m)", + xlarge: "var(--border-radius-l)", + xxlarge: "var(--border-radius-l)", +}; - switch (size) { - case "xsmall": - return "var(--border-radius-xs)"; - case "small": - return "var(--border-radius-s)"; - case "medium": - return "var(--border-radius-m)"; - case "large": - return "var(--border-radius-m)"; - case "xlarge": - return "var(--border-radius-l)"; - case "xxlarge": - return "var(--border-radius-l)"; - default: - return "var(--border-radius-m)"; - } +const sizeMap = { + xsmall: "var(--height-s)", + small: "var(--height-m)", + medium: "var(--height-xl)", + large: "var(--height-xxxl)", + xlarge: "72px", + xxlarge: "80px", }; -export const getSize = (size: AvatarPropsType["size"]) => { - switch (size) { - case "xsmall": - return "var(--height-s)"; - case "small": - return "var(--height-m)"; - case "medium": - return "var(--height-xl)"; - case "large": - return "var(--height-xxxl)"; - case "xlarge": - return "72px"; - case "xxlarge": - return "80px"; - default: - return "var(--height-xl)"; - } +const fontSizeMap = { + xsmall: "var(--typography-label-s)", + small: "var(--typography-label-m)", + medium: "var(--typography-label-l)", + large: "var(--typography-label-xl)", + xlarge: "32px", + xxlarge: "36px", }; -export const getFontSize = (size: AvatarPropsType["size"]) => { - switch (size) { - case "xsmall": - return "var(--typography-label-s)"; - case "small": - return "var(--typography-label-m)"; - case "medium": - return "var(--typography-label-l)"; - case "large": - return "var(--typography-label-xl)"; - case "xlarge": - return "32px"; - case "xxlarge": - return "36px"; - default: - return "var(--typography-label-l)"; - } +const iconSizeMap = { + xsmall: "var(--height-xxs)", + small: "var(--height-xs)", + medium: "var(--height-s)", + large: "var(--height-xl)", + xlarge: "var(--height-xxl)", + xxlarge: "52px", }; -export const getIconSize = (size: AvatarPropsType["size"]) => { - switch (size) { - case "xsmall": - return "var(--height-xxs)"; - case "small": - return "var(--height-xs)"; - case "medium": - return "var(--height-s)"; - case "large": - return "var(--height-xl)"; - case "xlarge": - return "var(--height-xxl)"; - case "xxlarge": - return "52px"; - default: - return "var(--height-s)"; - } +const borderWithMap = { + xsmall: "var(--border-width-s)", + small: "var(--border-width-s)", + medium: "var(--border-width-s)", + large: "var(--border-width-default)", + xlarge: "var(--border-width-default)", + xxlarge: "var(--border-width-default)", }; -export const getBorderWidth = (size: AvatarPropsType["size"]) => { - switch (size) { - case "xsmall": - case "small": - case "medium": - return "1px solid"; - case "large": - case "xlarge": - case "xxlarge": - return "2px solid"; - default: - return "1px solid"; - } +const modeColorMap = { + default: "var(--color-fg-neutral-strong)", + info: "var(--color-fg-secondary-medium)", + success: "var(--color-fg-success-medium)", + warning: "var(--color-fg-warning-strong)", + error: "var(--color-fg-error-medium)", }; -export const getModeColor = (mode: Required<AvatarPropsType>["status"]["mode"]) => { - switch (mode) { - case "default": - return "var(--color-fg-neutral-strong);"; - case "error": - return "var(--color-fg-error-medium)"; - case "info": - return "var(--color-fg-secondary-medium)"; - case "success": - return "var(--color-fg-success-medium)"; - case "warning": - return "var(--color-fg-warning-strong)"; +export const getColor = (color: AvatarPropsType["color"]) => (color ? contextualColorMap[color].text : undefined); +export const getBackgroundColor = (color: AvatarPropsType["color"]) => + color ? contextualColorMap[color].background : undefined; + +export const getBorderRadius = (shape: AvatarPropsType["shape"], size: AvatarPropsType["size"]) => { + if (shape === "circle") { + return "100%"; + } + if (shape === "square") { + return size ? borderRadiusMap[size] : "var(--border-radius-m)"; } + return "100%"; }; +export const getSize = (size: AvatarPropsType["size"]) => (size ? sizeMap[size] : "var(--height-xl)"); + +export const getFontSize = (size: AvatarPropsType["size"]) => (size ? fontSizeMap[size] : "var(--typography-label-l)"); + +export const getIconSize = (size: AvatarPropsType["size"]) => (size ? iconSizeMap[size] : "var(--height-s)"); + +export const getBorderWidth = (size: AvatarPropsType["size"]) => (size ? borderWithMap[size] : "var(--border-width-s)"); + +export const getModeColor = (mode: Required<AvatarPropsType>["status"]["mode"]) => + mode ? modeColorMap[mode] : "var(--color-fg-neutral-strong)"; + export const getInitials = (label?: string): string => { if (!label) return ""; - const words = label.trim().split(/\s+/).filter(Boolean); + const words = label.trim().split(/\s+/); if (words.length >= 2) { const firstChar = words[0]?.[0] ?? ""; const secondChar = words[1]?.[0] ?? ""; From bad82a6cba4f1ed4a1f8affd23f9fe4233292537 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Tue, 16 Sep 2025 11:40:40 +0200 Subject: [PATCH 05/22] Fix based on feedback --- apps/website/pages/components/avatar/index.tsx | 6 +++--- .../components/avatar/overview/AvatarOverviewPage.tsx | 10 +++++----- packages/lib/src/avatar/Avatar.test.tsx | 8 +------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/website/pages/components/avatar/index.tsx b/apps/website/pages/components/avatar/index.tsx index ad8b6213e..4de8cad70 100644 --- a/apps/website/pages/components/avatar/index.tsx +++ b/apps/website/pages/components/avatar/index.tsx @@ -3,14 +3,14 @@ import { ReactElement } from "react-markdown/lib/react-markdown"; import AvatarPageLayout from "screens/components/avatar/AvatarPageLayout"; import AvatarOverviewPage from "screens/components/avatar/overview/AvatarOverviewPage"; -const Index = () => { +const Index = () => ( <> <Head> <title>Avatar - Halstack Design System - ; -}; + +); Index.getLayout = (page: ReactElement) => {page}; diff --git a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx index 782f0b5a0..28cae5bf0 100644 --- a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx +++ b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx @@ -10,10 +10,10 @@ const sections = [ ]; const AvatarOverviewPage = () => ( - - - - -) + + + + +); export default AvatarOverviewPage; diff --git a/packages/lib/src/avatar/Avatar.test.tsx b/packages/lib/src/avatar/Avatar.test.tsx index f1b315877..4cc258dd9 100644 --- a/packages/lib/src/avatar/Avatar.test.tsx +++ b/packages/lib/src/avatar/Avatar.test.tsx @@ -1,13 +1,7 @@ import "@testing-library/jest-dom"; -import { fireEvent, queryByTestId, render } from "@testing-library/react"; +import { fireEvent, render } from "@testing-library/react"; import DxcAvatar from "./Avatar"; -(global as any).ResizeObserver = class ResizeObserver { - observe() {} - unobserve() {} - disconnect() {} -}; - describe("Avatar component tests", () => { test("Avatar renders correctly", () => { const { getByRole } = render(); From 6e218a77bcea2b07fdb91ba549d59cd524e80f2f Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso Date: Tue, 16 Sep 2025 16:23:59 +0200 Subject: [PATCH 06/22] Fix border and outline of the component states --- packages/lib/src/avatar/Avatar.tsx | 17 ++++++++++++----- packages/lib/src/avatar/utils.ts | 21 ++++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index e66138e96..7f86dbab5 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -13,6 +13,7 @@ import { getIconSize, getInitials, getModeColor, + getOutlineWidth, getSize, } from "./utils"; @@ -29,18 +30,23 @@ const AvatarContainer = styled.div<{ height: ${({ size }) => getSize(size)}; aspect-ratio: 1 / 1; text-decoration: none; - ${({ hasAction, disabled }) => - !disabled && hasAction && + ${({ hasAction, disabled, size }) => + !disabled && + hasAction && ` cursor: pointer; &:hover > div:first-child > div:first-child { display: block; } &:focus > div:first-child { - outline: 2px solid var(--border-color-secondary-medium); + outline-style: solid; + outline-width: ${getOutlineWidth(size)}; + outline-color: var(--border-color-secondary-strong); } &:active > div:first-child { - outline: 2px solid var(--border-color-secondary-medium); + outline-style: solid; + outline-width: ${getOutlineWidth(size)}; + outline-color: var(--border-color-secondary-strong); } &:active > div:first-child > div:first-child { display: block; @@ -108,7 +114,8 @@ const StatusContainer = styled.div<{ ${({ status }) => (status?.position === "top" ? "top: 0px;" : "bottom: 0px;")} width: 25%; height: 25%; - border: ${({ size }) => getBorderWidth(size)}; + border-width: ${({ size }) => getBorderWidth(size)}; + border-style: solid; border-color: var(--border-color-neutral-brighter); border-radius: 100%; background-color: ${({ status }) => getModeColor(status!.mode)}; diff --git a/packages/lib/src/avatar/utils.ts b/packages/lib/src/avatar/utils.ts index f0f5e9df8..2a6f8dd93 100644 --- a/packages/lib/src/avatar/utils.ts +++ b/packages/lib/src/avatar/utils.ts @@ -67,13 +67,22 @@ const iconSizeMap = { xxlarge: "52px", }; -const borderWithMap = { +const outlineWidthMap = { xsmall: "var(--border-width-s)", small: "var(--border-width-s)", medium: "var(--border-width-s)", - large: "var(--border-width-default)", - xlarge: "var(--border-width-default)", - xxlarge: "var(--border-width-default)", + large: "var(--border-width-l)", + xlarge: "var(--border-width-l)", + xxlarge: "var(--border-width-l)", +}; + +const borderWidthMap = { + xsmall: "var(--border-width-s)", + small: "var(--border-width-s)", + medium: "var(--border-width-s)", + large: "var(--border-width-m)", + xlarge: "var(--border-width-m)", + xxlarge: "var(--border-width-m)", }; const modeColorMap = { @@ -104,7 +113,9 @@ export const getFontSize = (size: AvatarPropsType["size"]) => (size ? fontSizeMa export const getIconSize = (size: AvatarPropsType["size"]) => (size ? iconSizeMap[size] : "var(--height-s)"); -export const getBorderWidth = (size: AvatarPropsType["size"]) => (size ? borderWithMap[size] : "var(--border-width-s)"); +export const getBorderWidth = (size: AvatarPropsType["size"]) => (size ? borderWidthMap[size] : "var(--border-width-s)"); + +export const getOutlineWidth = (size: AvatarPropsType["size"]) => (size ? outlineWidthMap[size] : "var(--border-width-m)"); export const getModeColor = (mode: Required["status"]["mode"]) => mode ? modeColorMap[mode] : "var(--color-fg-neutral-strong)"; From cdcde7cf54eb19fcfaa3d3001dc6cd0ca38a681d Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso Date: Tue, 16 Sep 2025 17:18:17 +0200 Subject: [PATCH 07/22] Fix focus and active color --- packages/lib/src/avatar/Avatar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 7f86dbab5..56fdfbec0 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -41,12 +41,12 @@ const AvatarContainer = styled.div<{ &:focus > div:first-child { outline-style: solid; outline-width: ${getOutlineWidth(size)}; - outline-color: var(--border-color-secondary-strong); + outline-color: var(--border-color-secondary-medium); } &:active > div:first-child { outline-style: solid; outline-width: ${getOutlineWidth(size)}; - outline-color: var(--border-color-secondary-strong); + outline-color: var(--border-color-secondary-medium); } &:active > div:first-child > div:first-child { display: block; From 74661643dc69c4dd58077a2dffb9d519a8cec481 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso Date: Wed, 17 Sep 2025 12:52:34 +0200 Subject: [PATCH 08/22] Update storybook with all states --- packages/lib/src/avatar/Avatar.stories.tsx | 355 ++++++++++++++------- 1 file changed, 247 insertions(+), 108 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 29dc029c1..a85126d61 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -3,130 +3,269 @@ import ExampleContainer from "../../.storybook/components/ExampleContainer"; import Title from "../../.storybook/components/Title"; import DxcAvatar from "./Avatar"; import DxcFlex from "../flex/Flex"; +import AvatarPropsType from "./types"; export default { title: "Avatar", component: DxcAvatar, } as Meta; -const Avatar = () => ( - <> - - <DxcFlex alignItems="end"> - <ExampleContainer> - <DxcAvatar size="xsmall" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="small" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="medium" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="large" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xlarge" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" /> - </ExampleContainer> - </DxcFlex> - <Title title="Colors" theme="light" level={2} /> - <DxcFlex> - <ExampleContainer> - <DxcAvatar size="xxlarge" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="blue" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="green" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="orange" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="red" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="yellow" /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" color="purple" /> - </ExampleContainer> - </DxcFlex> - <Title title="Square" theme="light" level={2} /> - <ExampleContainer> - <DxcAvatar size="xxlarge" shape="square" /> - </ExampleContainer> - <Title title="Image" theme="light" level={2} /> - <ExampleContainer> - <DxcAvatar size="xxlarge" imageSrc="https://picsum.photos/id/1022/200/300" /> - </ExampleContainer> - <Title title="Initials" theme="light" level={2} /> - <ExampleContainer> - <DxcAvatar size="xxlarge" label="John Doe" /> - </ExampleContainer> - <Title title="Custon Icon" theme="light" level={2} /> - <ExampleContainer> - <DxcAvatar size="xxlarge" icon="filled_shield" /> - </ExampleContainer> - <Title title="With tooltip" theme="light" level={2} /> +const AvatarStatusLine = ({ + shape, + size, + color, + disabled, + label, + imageSrc, +}: { + shape: AvatarPropsType["shape"]; + size: AvatarPropsType["size"]; + color: AvatarPropsType["color"]; + disabled?: AvatarPropsType["disabled"]; + label?: AvatarPropsType["label"]; + imageSrc?: AvatarPropsType["imageSrc"]; +}) => ( + <DxcFlex gap="var(--spacing-gap-l)"> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "default", position: "top" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "info", position: "top" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "success", position: "top" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "warning", position: "top" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "error", position: "top" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "default", position: "bottom" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "info", position: "bottom" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "success", position: "bottom" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "warning", position: "bottom" }} + disabled={disabled} + /> + <DxcAvatar + label={label} + imageSrc={imageSrc} + size={size} + shape={shape} + color={color} + onClick={() => console.log("")} + status={{ mode: "error", position: "bottom" }} + disabled={disabled} + /> + </DxcFlex> +); + +const AvatarStatesContainer = ({ + shape, + size, + color, + label, + imageSrc, +}: { + shape: AvatarPropsType["shape"]; + size: AvatarPropsType["size"]; + color?: AvatarPropsType["color"]; + label?: AvatarPropsType["label"]; + imageSrc?: AvatarPropsType["imageSrc"]; +}) => ( + <DxcFlex direction="column"> <ExampleContainer> - <DxcAvatar size="xxlarge" title="John Doe" /> + <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> </ExampleContainer> - <Title title="Status" theme="light" level={2} /> - <DxcFlex> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "default", position: "top" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "info", position: "top" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "success", position: "top" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "warning", position: "top" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "error", position: "top" }} /> - </ExampleContainer> - </DxcFlex> - <DxcFlex> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "default", position: "bottom" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "info", position: "bottom" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "success", position: "bottom" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "warning", position: "bottom" }} /> - </ExampleContainer> - <ExampleContainer> - <DxcAvatar size="xxlarge" status={{ mode: "error", position: "bottom" }} /> - </ExampleContainer> - </DxcFlex> - <Title title="Hover" theme="light" level={2} /> <ExampleContainer pseudoState="pseudo-hover"> - <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> </ExampleContainer> - <Title title="Focus" theme="light" level={2} /> <ExampleContainer pseudoState="pseudo-focus"> - <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> </ExampleContainer> - <Title title="Active" theme="light" level={2} /> <ExampleContainer pseudoState="pseudo-active"> - <DxcAvatar size="xxlarge" onClick={() => console.log()} /> + <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> </ExampleContainer> - <Title title="Disabled" theme="light" level={2} /> <ExampleContainer> - <DxcAvatar size="xxlarge" onClick={() => console.log()} disabled /> + <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} disabled /> </ExampleContainer> + </DxcFlex> +); + +const AvatarColorsContainer = ({ + size, + shape, + label, +}: { + shape?: AvatarPropsType["shape"]; + size: AvatarPropsType["size"]; + label?: AvatarPropsType["label"]; +}) => ( + <> + <Title title="Grey" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="grey" /> + <Title title="Blue" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="blue" /> + <Title title="Green" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="green" /> + <Title title="Orange" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="orange" /> + <Title title="Red" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="red" /> + <Title title="Yellow" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="yellow" /> + <Title title="Purple" theme="light" level={3} /> + <AvatarStatesContainer label={label} size={size} shape={shape} color="purple" /> + </> +); + +const AvatarImageContainer = ({ size, shape }: { size: AvatarPropsType["size"]; shape?: AvatarPropsType["shape"] }) => ( + <AvatarStatesContainer size={size} shape={shape} imageSrc="https://picsum.photos/id/1022/200/300" /> +); + +const AvatarShapeContainer = ({ shape }: { shape?: AvatarPropsType["shape"] }) => ( + <> + <> + <Title title="Xsmall" theme="light" level={2} /> + <AvatarColorsContainer size="xsmall" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="xsmall" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="xsmall" shape={shape} /> + </> + <> + <Title title="Small" theme="light" level={2} /> + <AvatarColorsContainer size="small" /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="small" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="small" shape={shape} /> + </> + <> + <Title title="Medium" theme="light" level={2} /> + <AvatarColorsContainer size="medium" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="medium" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="medium" shape={shape} /> + </> + <> + <Title title="Large" theme="light" level={2} /> + <AvatarColorsContainer size="large" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="large" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="large" shape={shape} /> + </> + <> + <Title title="Xlarge" theme="light" level={2} /> + <AvatarColorsContainer size="xlarge" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="xlarge" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="xlarge" shape={shape} /> + </> + <> + <Title title="XXlarge" theme="light" level={2} /> + <AvatarColorsContainer size="xxlarge" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer label="Avatar Component" size="xxlarge" shape={shape} /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="xxlarge" shape={shape} /> + </> + </> +); + +const Avatar = () => ( + <> + <Title title="Default" theme="light" level={2} /> + <AvatarShapeContainer shape="circle" /> + <Title title="Square" theme="light" level={2} /> + <AvatarShapeContainer shape="square" /> + <Title title="Tooltip" theme="light" level={2} /> + <DxcAvatar + size="xlarge" + onClick={() => console.log("")} + title="Avatar tooltip" + /> </> ); From b19ebffb038dc5a714644af55a1dbd98c71ecf8f Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Wed, 17 Sep 2025 13:46:28 +0200 Subject: [PATCH 09/22] Fix story book errors by dividing storybook into 3 different pages --- packages/lib/src/avatar/Avatar.stories.tsx | 24 +++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index a85126d61..c9d20b727 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -258,14 +258,20 @@ const Avatar = () => ( <> <Title title="Default" theme="light" level={2} /> <AvatarShapeContainer shape="circle" /> + </> +); + +const AvatarSquare = () => ( + <> <Title title="Square" theme="light" level={2} /> <AvatarShapeContainer shape="square" /> + </> +); + +const AvatarTooltip = () => ( + <> <Title title="Tooltip" theme="light" level={2} /> - <DxcAvatar - size="xlarge" - onClick={() => console.log("")} - title="Avatar tooltip" - /> + <DxcAvatar size="xlarge" onClick={() => console.log("")} title="Avatar tooltip" /> </> ); @@ -274,3 +280,11 @@ type Story = StoryObj<typeof DxcAvatar>; export const Chromatic: Story = { render: Avatar, }; + +export const Square: Story = { + render: AvatarSquare, +}; + +export const Tooltip: Story = { + render: AvatarTooltip, +}; \ No newline at end of file From 4df408df42f774c18a79cca98c8bad2c09d63b0a Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Wed, 17 Sep 2025 17:09:20 +0200 Subject: [PATCH 10/22] Reduce storybook variants --- packages/lib/src/avatar/Avatar.stories.tsx | 89 +++++++++------------- 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index c9d20b727..484e362d2 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -203,54 +203,37 @@ const AvatarImageContainer = ({ size, shape }: { size: AvatarPropsType["size"]; const AvatarShapeContainer = ({ shape }: { shape?: AvatarPropsType["shape"] }) => ( <> - <> - <Title title="Xsmall" theme="light" level={2} /> - <AvatarColorsContainer size="xsmall" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="xsmall" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="xsmall" shape={shape} /> - </> - <> - <Title title="Small" theme="light" level={2} /> - <AvatarColorsContainer size="small" /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="small" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="small" shape={shape} /> - </> - <> - <Title title="Medium" theme="light" level={2} /> - <AvatarColorsContainer size="medium" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="medium" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="medium" shape={shape} /> - </> - <> - <Title title="Large" theme="light" level={2} /> - <AvatarColorsContainer size="large" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="large" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="large" shape={shape} /> - </> - <> - <Title title="Xlarge" theme="light" level={2} /> - <AvatarColorsContainer size="xlarge" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="xlarge" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="xlarge" shape={shape} /> - </> - <> - <Title title="XXlarge" theme="light" level={2} /> - <AvatarColorsContainer size="xxlarge" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer label="Avatar Component" size="xxlarge" shape={shape} /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="xxlarge" shape={shape} /> - </> + <Title title="Xsmall" theme="light" level={2} /> + <AvatarStatesContainer size="xsmall" shape={shape} color="blue" label="Avatar" /> + <AvatarImageContainer size="xsmall" shape={shape} /> + + <Title title="Small" theme="light" level={2} /> + <Title title="All Colors" theme="light" level={3} /> + <AvatarColorsContainer size="small" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer size="small" shape={shape} label="Avatar Component" /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="small" shape={shape} /> + + <Title title="Medium" theme="light" level={2} /> + <AvatarStatesContainer size="medium" shape={shape} color="blue" label="Avatar" /> + <AvatarImageContainer size="medium" shape={shape} /> + + <Title title="Large" theme="light" level={2} /> + <AvatarStatesContainer size="large" shape={shape} color="blue" label="Avatar" /> + <AvatarImageContainer size="large" shape={shape} /> + + <Title title="Xlarge" theme="light" level={2} /> + <Title title="All Colors" theme="light" level={3} /> + <AvatarColorsContainer size="xlarge" shape={shape} /> + <Title title="Label" theme="light" level={3} /> + <AvatarColorsContainer size="xlarge" shape={shape} label="Avatar Component" /> + <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="xlarge" shape={shape} /> + + <Title title="XXlarge" theme="light" level={2} /> + <AvatarStatesContainer size="xxlarge" shape={shape} color="blue" label="Avatar" /> + <AvatarImageContainer size="xxlarge" shape={shape} /> </> ); @@ -268,7 +251,7 @@ const AvatarSquare = () => ( </> ); -const AvatarTooltip = () => ( +const TooltipAvatar = () => ( <> <Title title="Tooltip" theme="light" level={2} /> <DxcAvatar size="xlarge" onClick={() => console.log("")} title="Avatar tooltip" /> @@ -281,10 +264,10 @@ export const Chromatic: Story = { render: Avatar, }; -export const Square: Story = { +export const SquareAvatar: Story = { render: AvatarSquare, }; -export const Tooltip: Story = { - render: AvatarTooltip, -}; \ No newline at end of file +export const AvatarTooltip: Story = { + render: TooltipAvatar, +}; From 364a08f2db0766dde0b668a7f382790b76c9e512 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Thu, 18 Sep 2025 14:01:51 +0200 Subject: [PATCH 11/22] Avatar tooltip is displayed by default and reordered avatar circle and square storybook --- packages/lib/src/avatar/Avatar.stories.tsx | 47 ++++++++++++---------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 484e362d2..2b8330ea1 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -4,6 +4,7 @@ import Title from "../../.storybook/components/Title"; import DxcAvatar from "./Avatar"; import DxcFlex from "../flex/Flex"; import AvatarPropsType from "./types"; +import { userEvent, within } from "@storybook/test"; export default { title: "Avatar", @@ -180,19 +181,19 @@ const AvatarColorsContainer = ({ label?: AvatarPropsType["label"]; }) => ( <> - <Title title="Grey" theme="light" level={3} /> + <Title title="Grey" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="grey" /> - <Title title="Blue" theme="light" level={3} /> + <Title title="Blue" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="blue" /> - <Title title="Green" theme="light" level={3} /> + <Title title="Green" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="green" /> - <Title title="Orange" theme="light" level={3} /> + <Title title="Orange" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="orange" /> - <Title title="Red" theme="light" level={3} /> + <Title title="Red" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="red" /> - <Title title="Yellow" theme="light" level={3} /> + <Title title="Yellow" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="yellow" /> - <Title title="Purple" theme="light" level={3} /> + <Title title="Purple" theme="light" level={4} /> <AvatarStatesContainer label={label} size={size} shape={shape} color="purple" /> </> ); @@ -204,35 +205,35 @@ const AvatarImageContainer = ({ size, shape }: { size: AvatarPropsType["size"]; const AvatarShapeContainer = ({ shape }: { shape?: AvatarPropsType["shape"] }) => ( <> <Title title="Xsmall" theme="light" level={2} /> - <AvatarStatesContainer size="xsmall" shape={shape} color="blue" label="Avatar" /> - <AvatarImageContainer size="xsmall" shape={shape} /> - - <Title title="Small" theme="light" level={2} /> <Title title="All Colors" theme="light" level={3} /> - <AvatarColorsContainer size="small" shape={shape} /> + <AvatarColorsContainer size="xsmall" shape={shape} /> <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer size="small" shape={shape} label="Avatar Component" /> + <AvatarColorsContainer size="xsmall" shape={shape} label="Avatar Component" /> <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="xsmall" shape={shape} /> + + <Title title="Small" theme="light" level={2} /> + <AvatarStatesContainer size="small" shape={shape} color="blue" /> <AvatarImageContainer size="small" shape={shape} /> <Title title="Medium" theme="light" level={2} /> - <AvatarStatesContainer size="medium" shape={shape} color="blue" label="Avatar" /> + <AvatarStatesContainer size="medium" shape={shape} color="blue" /> <AvatarImageContainer size="medium" shape={shape} /> <Title title="Large" theme="light" level={2} /> - <AvatarStatesContainer size="large" shape={shape} color="blue" label="Avatar" /> - <AvatarImageContainer size="large" shape={shape} /> - - <Title title="Xlarge" theme="light" level={2} /> <Title title="All Colors" theme="light" level={3} /> - <AvatarColorsContainer size="xlarge" shape={shape} /> + <AvatarColorsContainer size="large" shape={shape} /> <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer size="xlarge" shape={shape} label="Avatar Component" /> + <AvatarColorsContainer size="large" shape={shape} label="Avatar Component" /> <Title title="Image" theme="light" level={3} /> + <AvatarImageContainer size="large" shape={shape} /> + + <Title title="Xlarge" theme="light" level={2} /> + <AvatarStatesContainer size="xlarge" shape={shape} color="blue" /> <AvatarImageContainer size="xlarge" shape={shape} /> <Title title="XXlarge" theme="light" level={2} /> - <AvatarStatesContainer size="xxlarge" shape={shape} color="blue" label="Avatar" /> + <AvatarStatesContainer size="xxlarge" shape={shape} color="blue" /> <AvatarImageContainer size="xxlarge" shape={shape} /> </> ); @@ -270,4 +271,8 @@ export const SquareAvatar: Story = { export const AvatarTooltip: Story = { render: TooltipAvatar, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + await userEvent.hover(canvas.getByRole("button")); + }, }; From 1a6f5f00a7fa3d96c662e4c1104dd86ec5b841fc Mon Sep 17 00:00:00 2001 From: Mil4n0r <morenocarmonaenrique@gmail.com> Date: Fri, 19 Sep 2025 10:25:08 +0200 Subject: [PATCH 12/22] Added new logic to ease displaying all the variants in stories --- .../components/ExampleContainer.tsx | 4 +- packages/lib/src/avatar/Avatar.stories.tsx | 465 ++++++++---------- packages/lib/src/avatar/types.ts | 2 +- 3 files changed, 212 insertions(+), 259 deletions(-) diff --git a/packages/lib/.storybook/components/ExampleContainer.tsx b/packages/lib/.storybook/components/ExampleContainer.tsx index 296bc04eb..f27c7155a 100644 --- a/packages/lib/.storybook/components/ExampleContainer.tsx +++ b/packages/lib/.storybook/components/ExampleContainer.tsx @@ -1,7 +1,7 @@ import { ReactNode } from "react"; import styled from "@emotion/styled"; -type PseudoStates = +export type PseudoState = | "pseudo-active" | "pseudo-focus" | "pseudo-focus-visible" @@ -13,7 +13,7 @@ type PseudoStates = type Props = { children?: ReactNode; - pseudoState?: PseudoStates | PseudoStates[]; + pseudoState?: PseudoState | PseudoState[]; expanded?: boolean; }; diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 2b8330ea1..7118435ac 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -1,278 +1,231 @@ import { Meta, StoryObj } from "@storybook/react"; -import ExampleContainer from "../../.storybook/components/ExampleContainer"; -import Title from "../../.storybook/components/Title"; import DxcAvatar from "./Avatar"; import DxcFlex from "../flex/Flex"; -import AvatarPropsType from "./types"; -import { userEvent, within } from "@storybook/test"; +import Title from "../../.storybook/components/Title"; +import ExampleContainer, { PseudoState } from "../../.storybook/components/ExampleContainer"; +import AvatarPropsType, { Status } from "./types"; export default { title: "Avatar", component: DxcAvatar, } as Meta<typeof DxcAvatar>; -const AvatarStatusLine = ({ - shape, - size, - color, - disabled, - label, - imageSrc, -}: { - shape: AvatarPropsType["shape"]; - size: AvatarPropsType["size"]; - color: AvatarPropsType["color"]; - disabled?: AvatarPropsType["disabled"]; - label?: AvatarPropsType["label"]; - imageSrc?: AvatarPropsType["imageSrc"]; -}) => ( - <DxcFlex gap="var(--spacing-gap-l)"> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "default", position: "top" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "info", position: "top" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "success", position: "top" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "warning", position: "top" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "error", position: "top" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "default", position: "bottom" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "info", position: "bottom" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "success", position: "bottom" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "warning", position: "bottom" }} - disabled={disabled} - /> - <DxcAvatar - label={label} - imageSrc={imageSrc} - size={size} - shape={shape} - color={color} - onClick={() => console.log("")} - status={{ mode: "error", position: "bottom" }} - disabled={disabled} - /> - </DxcFlex> -); +type Story = StoryObj<typeof DxcAvatar>; -const AvatarStatesContainer = ({ - shape, - size, - color, - label, - imageSrc, -}: { - shape: AvatarPropsType["shape"]; - size: AvatarPropsType["size"]; - color?: AvatarPropsType["color"]; +type GroupingKey = "size" | "shape" | "color" | "statusPosition" | "statusMode" | "pseudoState"; + +type AvatarRowProps = { + sizes?: AvatarPropsType["size"][]; + shapes?: AvatarPropsType["shape"][]; + colors?: AvatarPropsType["color"][]; label?: AvatarPropsType["label"]; + icon?: AvatarPropsType["icon"]; imageSrc?: AvatarPropsType["imageSrc"]; -}) => ( - <DxcFlex direction="column"> - <ExampleContainer> - <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-hover"> - <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-focus"> - <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-active"> - <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} /> - </ExampleContainer> - <ExampleContainer> - <AvatarStatusLine imageSrc={imageSrc} label={label} size={size} shape={shape} color={color} disabled /> - </ExampleContainer> - </DxcFlex> -); + statusModes?: Status["mode"][]; + statusPositions?: Status["position"][]; + pseudoStates?: (PseudoState | undefined)[]; + groupBy?: GroupingKey[]; +}; -const AvatarColorsContainer = ({ - size, - shape, +const AvatarRow = ({ + sizes = ["medium"], + shapes = ["circle"], + colors = ["grey"], label, -}: { - shape?: AvatarPropsType["shape"]; - size: AvatarPropsType["size"]; - label?: AvatarPropsType["label"]; -}) => ( - <> - <Title title="Grey" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="grey" /> - <Title title="Blue" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="blue" /> - <Title title="Green" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="green" /> - <Title title="Orange" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="orange" /> - <Title title="Red" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="red" /> - <Title title="Yellow" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="yellow" /> - <Title title="Purple" theme="light" level={4} /> - <AvatarStatesContainer label={label} size={size} shape={shape} color="purple" /> - </> -); - -const AvatarImageContainer = ({ size, shape }: { size: AvatarPropsType["size"]; shape?: AvatarPropsType["shape"] }) => ( - <AvatarStatesContainer size={size} shape={shape} imageSrc="https://picsum.photos/id/1022/200/300" /> -); - -const AvatarShapeContainer = ({ shape }: { shape?: AvatarPropsType["shape"] }) => ( - <> - <Title title="Xsmall" theme="light" level={2} /> - <Title title="All Colors" theme="light" level={3} /> - <AvatarColorsContainer size="xsmall" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer size="xsmall" shape={shape} label="Avatar Component" /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="xsmall" shape={shape} /> - - <Title title="Small" theme="light" level={2} /> - <AvatarStatesContainer size="small" shape={shape} color="blue" /> - <AvatarImageContainer size="small" shape={shape} /> - - <Title title="Medium" theme="light" level={2} /> - <AvatarStatesContainer size="medium" shape={shape} color="blue" /> - <AvatarImageContainer size="medium" shape={shape} /> - - <Title title="Large" theme="light" level={2} /> - <Title title="All Colors" theme="light" level={3} /> - <AvatarColorsContainer size="large" shape={shape} /> - <Title title="Label" theme="light" level={3} /> - <AvatarColorsContainer size="large" shape={shape} label="Avatar Component" /> - <Title title="Image" theme="light" level={3} /> - <AvatarImageContainer size="large" shape={shape} /> - - <Title title="Xlarge" theme="light" level={2} /> - <AvatarStatesContainer size="xlarge" shape={shape} color="blue" /> - <AvatarImageContainer size="xlarge" shape={shape} /> - - <Title title="XXlarge" theme="light" level={2} /> - <AvatarStatesContainer size="xxlarge" shape={shape} color="blue" /> - <AvatarImageContainer size="xxlarge" shape={shape} /> - </> -); - -const Avatar = () => ( - <> - <Title title="Default" theme="light" level={2} /> - <AvatarShapeContainer shape="circle" /> - </> -); - -const AvatarSquare = () => ( - <> - <Title title="Square" theme="light" level={2} /> - <AvatarShapeContainer shape="square" /> - </> -); + icon, + imageSrc, + statusModes, + statusPositions = [], + pseudoStates = [], + groupBy = ["size"], +}: AvatarRowProps) => { + const getValuesForKey = (key?: GroupingKey) => { + switch (key) { + case "size": + return sizes as string[]; + case "shape": + return shapes as string[]; + case "color": + return colors as string[]; + case "statusPosition": + return statusPositions as string[]; + case "statusMode": + return statusModes as string[]; + case "pseudoState": + return pseudoStates; + default: + return []; + } + }; + + const renderGroup = ( + level: number, + filters: { + size?: AvatarPropsType["size"]; + shape?: AvatarPropsType["shape"]; + color?: AvatarPropsType["color"]; + statusMode?: Status["mode"]; + statusPosition?: Status["position"]; + pseudoState?: PseudoState; + } + ): JSX.Element | JSX.Element[] => { + // Base case: render avatars + if (level >= groupBy.length) { + const sizesToRender = filters.size ? [filters.size] : sizes; + const colorsToRender = filters.color ? [filters.color] : colors; + const shapesToRender = filters.shape ? [filters.shape] : shapes; + const positionsToRender = filters.statusPosition + ? [filters.statusPosition] + : statusPositions.length + ? statusPositions + : [undefined]; + const modesToRender = filters.statusMode ? [filters.statusMode] : statusModes?.length ? statusModes : [undefined]; + + const pseudoStatesEnabled = !!filters.pseudoState; + + return shapesToRender.map((shape) => ( + <DxcFlex + key={`shape-${shape}-${String(filters.size ?? "all")}-${String(filters.color ?? "all")}`} + gap="var(--spacing-gap-l)" + wrap="wrap" + > + {sizesToRender.map((size) => + colorsToRender.map((color) => + positionsToRender.map((position) => + modesToRender.map((mode) => ( + <ExampleContainer + key={`${size}-${shape}-${color}-${mode}-${position ?? "none"}`} + pseudoState={filters.pseudoState} + > + <DxcAvatar + size={size} + shape={shape} + color={color} + label={label} + icon={icon} + imageSrc={imageSrc} + status={position && mode ? { position, mode: mode } : undefined} + onClick={pseudoStatesEnabled ? () => console.log("") : undefined} + /> + </ExampleContainer> + )) + ) + ) + )} + </DxcFlex> + )); + } + + const key = groupBy[level]; + const values = getValuesForKey(key); + + return values.map((value) => { + const newFilters = { ...filters }; + if (key === "size") newFilters.size = value as AvatarPropsType["size"]; + else if (key === "shape") newFilters.shape = value as AvatarPropsType["shape"]; + else if (key === "color") newFilters.color = value as AvatarPropsType["color"]; + else if (key === "statusPosition") newFilters.statusPosition = value as Status["position"]; + else if (key === "statusMode") newFilters.statusMode = value as Status["mode"]; + else if (key === "pseudoState") newFilters.pseudoState = value as PseudoState; + + return ( + <div key={`${key}-${String(value)}`}> + <Title title={String(value)} theme="light" level={3 + level} /> + {renderGroup(level + 1, newFilters)} + </div> + ); + }); + }; + + return <>{renderGroup(0, {})}</>; +}; -const TooltipAvatar = () => ( - <> - <Title title="Tooltip" theme="light" level={2} /> - <DxcAvatar size="xlarge" onClick={() => console.log("")} title="Avatar tooltip" /> - </> -); +export const Shapes: Story = { + render: () => ( + <> + <Title title="Shapes" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle", "square"]} + groupBy={["shape", "size"]} + /> + </> + ), +}; -type Story = StoryObj<typeof DxcAvatar>; +export const Colors: Story = { + render: () => ( + <> + <Title title="Colors" theme="light" level={2} /> + <AvatarRow + sizes={["medium"]} + shapes={["circle"]} + colors={["grey", "blue", "green", "orange", "red", "yellow", "purple"]} + groupBy={["color"]} + /> + </> + ), +}; -export const Chromatic: Story = { - render: Avatar, +export const Statuses: Story = { + render: () => ( + <> + <Title title="Statuses" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + statusModes={["default", "info", "success", "warning", "error"]} + statusPositions={["top", "bottom"]} + groupBy={["statusPosition", "statusMode"]} + /> + </> + ), }; -export const SquareAvatar: Story = { - render: AvatarSquare, +export const PseudoStates: Story = { + render: () => ( + <> + <Title title="Pseudo states" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + pseudoStates={[undefined, "pseudo-hover", "pseudo-focus", "pseudo-active"]} + groupBy={["pseudoState", "size"]} + /> + </> + ), }; -export const AvatarTooltip: Story = { - render: TooltipAvatar, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - await userEvent.hover(canvas.getByRole("button")); - }, +export const Types: Story = { + render: () => ( + <> + <Title title="Label" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + label="John Doe" + groupBy={["size"]} + /> + <Title title="Image" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + imageSrc="https://picsum.photos/id/1022/200/300" + groupBy={["size"]} + /> + <Title title="Icon (custom)" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + icon="settings" + groupBy={["size"]} + /> + <Title title="Icon (default)" theme="light" level={2} /> + <AvatarRow + sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + shapes={["circle"]} + groupBy={["size"]} + /> + </> + ), }; diff --git a/packages/lib/src/avatar/types.ts b/packages/lib/src/avatar/types.ts index 879e8d0ac..7faf0353f 100644 --- a/packages/lib/src/avatar/types.ts +++ b/packages/lib/src/avatar/types.ts @@ -3,7 +3,7 @@ import { SVG } from "../common/utils"; type Size = "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge"; type Shape = "circle" | "square"; type Color = "grey" | "blue" | "green" | "orange" | "red" | "yellow" | "purple"; -interface Status { +export interface Status { mode: "default" | "info" | "success" | "warning" | "error"; position: "top" | "bottom"; } From 8060acf14a9949e5b4ad7821ff497c2d0c52777c Mon Sep 17 00:00:00 2001 From: Mil4n0r <morenocarmonaenrique@gmail.com> Date: Fri, 19 Sep 2025 10:26:02 +0200 Subject: [PATCH 13/22] Removed comment --- packages/lib/src/avatar/Avatar.stories.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 7118435ac..63481f863 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -69,7 +69,6 @@ const AvatarRow = ({ pseudoState?: PseudoState; } ): JSX.Element | JSX.Element[] => { - // Base case: render avatars if (level >= groupBy.length) { const sizesToRender = filters.size ? [filters.size] : sizes; const colorsToRender = filters.color ? [filters.color] : colors; From b3e64ed676aa5ff656292a10b61037f6b11a7694 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Fri, 19 Sep 2025 11:30:15 +0200 Subject: [PATCH 14/22] Added status variant to pseudoStates story and added color variants to statuses story --- packages/lib/src/avatar/Avatar.stories.tsx | 7 +++++-- packages/lib/src/avatar/utils.ts | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 63481f863..3116ebeef 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -22,7 +22,7 @@ type AvatarRowProps = { icon?: AvatarPropsType["icon"]; imageSrc?: AvatarPropsType["imageSrc"]; statusModes?: Status["mode"][]; - statusPositions?: Status["position"][]; + statusPositions?: (Status["position"]| undefined)[]; pseudoStates?: (PseudoState | undefined)[]; groupBy?: GroupingKey[]; }; @@ -172,10 +172,11 @@ export const Statuses: Story = { <Title title="Statuses" theme="light" level={2} /> <AvatarRow sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} + colors={["grey", "blue", "green", "orange", "red", "yellow", "purple"]} shapes={["circle"]} statusModes={["default", "info", "success", "warning", "error"]} statusPositions={["top", "bottom"]} - groupBy={["statusPosition", "statusMode"]} + groupBy={["statusPosition", "statusMode", "color"]} /> </> ), @@ -188,6 +189,8 @@ export const PseudoStates: Story = { <AvatarRow sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} shapes={["circle"]} + statusModes={["success"]} + statusPositions={[undefined, "top", "bottom"]} pseudoStates={[undefined, "pseudo-hover", "pseudo-focus", "pseudo-active"]} groupBy={["pseudoState", "size"]} /> diff --git a/packages/lib/src/avatar/utils.ts b/packages/lib/src/avatar/utils.ts index 2a6f8dd93..23876a5f5 100644 --- a/packages/lib/src/avatar/utils.ts +++ b/packages/lib/src/avatar/utils.ts @@ -68,9 +68,9 @@ const iconSizeMap = { }; const outlineWidthMap = { - xsmall: "var(--border-width-s)", - small: "var(--border-width-s)", - medium: "var(--border-width-s)", + xsmall: "var(--border-width-m)", + small: "var(--border-width-m)", + medium: "var(--border-width-m)", large: "var(--border-width-l)", xlarge: "var(--border-width-l)", xxlarge: "var(--border-width-l)", From ec9be783abb9978aed74c22c9d73c86634c6ae7a Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Fri, 26 Sep 2025 14:57:04 +0200 Subject: [PATCH 15/22] Add DxcTypography & some code improvements --- packages/lib/src/avatar/Avatar.tsx | 81 ++++++++++++++++-------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 56fdfbec0..779dab07c 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -1,9 +1,7 @@ import { useState } from "react"; -import AvatarPropsType from "./types"; import styled from "@emotion/styled"; -import DxcImage from "../image/Image"; -import DxcIcon from "../icon/Icon"; -import { TooltipWrapper } from "../tooltip/Tooltip"; +import { css } from "@emotion/react"; +import AvatarPropsType from "./types"; import { getBackgroundColor, getBorderRadius, @@ -16,6 +14,10 @@ import { getOutlineWidth, getSize, } from "./utils"; +import DxcTypography from "../typography/Typography"; +import DxcImage from "../image/Image"; +import DxcIcon from "../icon/Icon"; +import { TooltipWrapper } from "../tooltip/Tooltip"; const AvatarContainer = styled.div<{ hasAction?: boolean; @@ -33,32 +35,32 @@ const AvatarContainer = styled.div<{ ${({ hasAction, disabled, size }) => !disabled && hasAction && - ` - cursor: pointer; - &:hover > div:first-child > div:first-child { - display: block; - } - &:focus > div:first-child { - outline-style: solid; - outline-width: ${getOutlineWidth(size)}; - outline-color: var(--border-color-secondary-medium); - } - &:active > div:first-child { - outline-style: solid; - outline-width: ${getOutlineWidth(size)}; - outline-color: var(--border-color-secondary-medium); - } - &:active > div:first-child > div:first-child { - display: block; - } + css` + cursor: pointer; + &:hover > div:first-child > div:first-child { + display: block; + } + &:focus > div:first-child { + outline-style: solid; + outline-width: ${getOutlineWidth(size)}; + outline-color: var(--border-color-secondary-medium); + } + &:active > div:first-child { + outline-style: solid; + outline-width: ${getOutlineWidth(size)}; + outline-color: var(--border-color-secondary-medium); + } + &:active > div:first-child > div:first-child { + display: block; + } `} ${({ disabled }) => disabled && - ` + css` cursor: not-allowed; & > div:first-child > div:first-child { display: block; - background-color: rgba(255, 255, 255, 0.50); + background-color: rgba(255, 255, 255, 0.5); } `} `; @@ -88,15 +90,6 @@ const Overlay = styled.div` background-color: var(--color-alpha-400-a); `; -const Initials = styled.div<{ size: AvatarPropsType["size"] }>` - color: inherit; - font-family: var(--typography-font-family); - font-style: normal; - font-weight: var(--typography-label-semibold); - font-size: ${({ size }) => getFontSize(size)}; - line-height: normal; -`; - const AvatarIcon = styled.div<{ color: AvatarPropsType["color"]; size: AvatarPropsType["size"] }>` display: flex; justify-content: center; @@ -121,7 +114,7 @@ const StatusContainer = styled.div<{ background-color: ${({ status }) => getModeColor(status!.mode)}; `; -export default function DxcAvatar({ +const DxcAvatar = ({ color = "grey", disabled = false, icon = "person", @@ -134,7 +127,7 @@ export default function DxcAvatar({ status, tabIndex = 0, title, -}: AvatarPropsType) { +}: AvatarPropsType) => { const [error, setError] = useState<boolean>(false); const initials = getInitials(label); @@ -147,7 +140,7 @@ export default function DxcAvatar({ tabIndex={!disabled && (onClick || linkHref) ? tabIndex : undefined} role={onClick ? "button" : undefined} as={linkHref ? "a" : undefined} - href={!disabled && linkHref ? linkHref : undefined} + href={(!disabled && linkHref) || undefined} aria-label={(onClick || linkHref) && (label || title || "Avatar")} disabled={disabled} > @@ -164,7 +157,17 @@ export default function DxcAvatar({ objectPosition="center" /> ) : initials.length > 0 ? ( - <Initials size={size}>{initials}</Initials> + <DxcTypography + as="span" + fontFamily="var(--typography-font-family)" + fontSize={getFontSize(size)} + fontWeight="var(--typography-label-semibold)" + fontStyle="normal" + lineHeight="normal" + color="inherit" + > + {initials} + </DxcTypography> ) : ( <AvatarIcon size={size} color={color}> {icon && (typeof icon === "string" ? <DxcIcon icon={icon} /> : icon)} @@ -175,4 +178,6 @@ export default function DxcAvatar({ </AvatarContainer> </TooltipWrapper> ); -} +}; + +export default DxcAvatar; \ No newline at end of file From 13f2c214346a00b4ec70a7e1f5ea2e8c7229ed39 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Mon, 6 Oct 2025 09:19:47 +0200 Subject: [PATCH 16/22] Added new semantic token and changed color variants to fit same guidelines as the Badge component --- packages/lib/src/avatar/Avatar.stories.tsx | 8 ++--- packages/lib/src/avatar/Avatar.tsx | 4 +-- packages/lib/src/avatar/types.ts | 2 +- packages/lib/src/avatar/utils.ts | 40 +++++++++++++--------- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index 3116ebeef..c57c082ca 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -22,7 +22,7 @@ type AvatarRowProps = { icon?: AvatarPropsType["icon"]; imageSrc?: AvatarPropsType["imageSrc"]; statusModes?: Status["mode"][]; - statusPositions?: (Status["position"]| undefined)[]; + statusPositions?: (Status["position"] | undefined)[]; pseudoStates?: (PseudoState | undefined)[]; groupBy?: GroupingKey[]; }; @@ -30,7 +30,7 @@ type AvatarRowProps = { const AvatarRow = ({ sizes = ["medium"], shapes = ["circle"], - colors = ["grey"], + colors = ["neutral"], label, icon, imageSrc, @@ -159,7 +159,7 @@ export const Colors: Story = { <AvatarRow sizes={["medium"]} shapes={["circle"]} - colors={["grey", "blue", "green", "orange", "red", "yellow", "purple"]} + colors={["neutral", "primary", "secondary", "tertiary", "success", "warning", "error", "info"]} groupBy={["color"]} /> </> @@ -172,7 +172,7 @@ export const Statuses: Story = { <Title title="Statuses" theme="light" level={2} /> <AvatarRow sizes={["xsmall", "small", "medium", "large", "xlarge", "xxlarge"]} - colors={["grey", "blue", "green", "orange", "red", "yellow", "purple"]} + colors={["neutral", "primary", "secondary", "tertiary", "success", "warning", "error", "info"]} shapes={["circle"]} statusModes={["default", "info", "success", "warning", "error"]} statusPositions={["top", "bottom"]} diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 779dab07c..152202bb0 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -115,7 +115,7 @@ const StatusContainer = styled.div<{ `; const DxcAvatar = ({ - color = "grey", + color = "neutral", disabled = false, icon = "person", imageSrc, @@ -180,4 +180,4 @@ const DxcAvatar = ({ ); }; -export default DxcAvatar; \ No newline at end of file +export default DxcAvatar; diff --git a/packages/lib/src/avatar/types.ts b/packages/lib/src/avatar/types.ts index 7faf0353f..38c5ba580 100644 --- a/packages/lib/src/avatar/types.ts +++ b/packages/lib/src/avatar/types.ts @@ -2,7 +2,7 @@ import { SVG } from "../common/utils"; type Size = "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge"; type Shape = "circle" | "square"; -type Color = "grey" | "blue" | "green" | "orange" | "red" | "yellow" | "purple"; +type Color = "primary" | "secondary" | "tertiary" | "success" | "info" | "neutral" | "warning" | "error"; export interface Status { mode: "default" | "info" | "success" | "warning" | "error"; position: "top" | "bottom"; diff --git a/packages/lib/src/avatar/utils.ts b/packages/lib/src/avatar/utils.ts index 23876a5f5..904062128 100644 --- a/packages/lib/src/avatar/utils.ts +++ b/packages/lib/src/avatar/utils.ts @@ -1,34 +1,38 @@ import AvatarPropsType from "./types"; const contextualColorMap = { - grey: { - background: "var(--color-bg-neutral-light)", - text: "var(--color-fg-neutral-strongest)", + primary: { + background: "var(--color-bg-primary-lighter)", + text: "var(--color-fg-primary-stronger)", }, - blue: { + secondary: { background: "var(--color-bg-secondary-lighter)", text: "var(--color-fg-secondary-stronger)", }, - green: { + tertiary: { + background: "var(--color-bg-yellow-light)", + text: "var(--color-fg-neutral-yellow-dark)", + }, + neutral: { + background: "var(--color-bg-neutral-light)", + text: "var(--color-fg-neutral-strongest)", + }, + info: { + background: "var(--color-bg-info-lighter)", + text: "var(--color-fg-info-stronger)", + }, + success: { background: "var(--color-bg-success-lighter)", text: "var(--color-fg-success-stronger)", }, - orange: { + warning: { background: "var(--color-bg-warning-lighter)", text: "var(--color-fg-warning-stronger)", }, - red: { + error: { background: "var(--color-bg-error-lighter)", text: "var(--color-fg-error-stronger)", }, - yellow: { - background: "var(--color-bg-yellow-light)", - text: "var(--color-fg-neutral-yellow-dark)", - }, - purple: { - background: "var(--color-bg-primary-lighter)", - text: "var(--color-fg-primary-stronger)", - }, }; const borderRadiusMap = { @@ -113,9 +117,11 @@ export const getFontSize = (size: AvatarPropsType["size"]) => (size ? fontSizeMa export const getIconSize = (size: AvatarPropsType["size"]) => (size ? iconSizeMap[size] : "var(--height-s)"); -export const getBorderWidth = (size: AvatarPropsType["size"]) => (size ? borderWidthMap[size] : "var(--border-width-s)"); +export const getBorderWidth = (size: AvatarPropsType["size"]) => + size ? borderWidthMap[size] : "var(--border-width-s)"; -export const getOutlineWidth = (size: AvatarPropsType["size"]) => (size ? outlineWidthMap[size] : "var(--border-width-m)"); +export const getOutlineWidth = (size: AvatarPropsType["size"]) => + size ? outlineWidthMap[size] : "var(--border-width-m)"; export const getModeColor = (mode: Required<AvatarPropsType>["status"]["mode"]) => mode ? modeColorMap[mode] : "var(--color-fg-neutral-strong)"; From 8f53c5ef84fde68b2c951698b59593e4c1e5795f Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Thu, 9 Oct 2025 13:09:49 +0200 Subject: [PATCH 17/22] Minor fix on href prop --- packages/lib/src/avatar/Avatar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 152202bb0..374e50e35 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -140,7 +140,7 @@ const DxcAvatar = ({ tabIndex={!disabled && (onClick || linkHref) ? tabIndex : undefined} role={onClick ? "button" : undefined} as={linkHref ? "a" : undefined} - href={(!disabled && linkHref) || undefined} + href={!disabled ? linkHref : undefined} aria-label={(onClick || linkHref) && (label || title || "Avatar")} disabled={disabled} > From 7f3f77a960d796139660b600807a22bcc983d0a8 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Fri, 10 Oct 2025 08:55:42 +0200 Subject: [PATCH 18/22] Added React.AnchorHTMLAttributes<HTMLAnchorElement> to Avatar.tsx --- packages/lib/src/avatar/Avatar.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 374e50e35..28b357bfc 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -19,12 +19,13 @@ import DxcImage from "../image/Image"; import DxcIcon from "../icon/Icon"; import { TooltipWrapper } from "../tooltip/Tooltip"; -const AvatarContainer = styled.div<{ - hasAction?: boolean; - size: AvatarPropsType["size"]; - href?: AvatarPropsType["linkHref"]; - disabled?: AvatarPropsType["disabled"]; -}>` +const AvatarContainer = styled.div< + { + hasAction?: boolean; + size: AvatarPropsType["size"]; + disabled?: AvatarPropsType["disabled"]; + } & React.AnchorHTMLAttributes<HTMLAnchorElement> +>` position: relative; display: flex; justify-content: center; From c765e92d09bf06e9967694185f66bae7132e5bee Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Fri, 10 Oct 2025 09:18:39 +0200 Subject: [PATCH 19/22] Improve code quality --- packages/lib/src/avatar/Avatar.tsx | 154 +++++++++++++++-------------- 1 file changed, 79 insertions(+), 75 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.tsx b/packages/lib/src/avatar/Avatar.tsx index 28b357bfc..a4e1a13bc 100644 --- a/packages/lib/src/avatar/Avatar.tsx +++ b/packages/lib/src/avatar/Avatar.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { memo, useCallback, useMemo, useState } from "react"; import styled from "@emotion/styled"; import { css } from "@emotion/react"; import AvatarPropsType from "./types"; @@ -38,22 +38,16 @@ const AvatarContainer = styled.div< hasAction && css` cursor: pointer; - &:hover > div:first-child > div:first-child { + &:hover > div:first-child > div:first-child, + &:active > div:first-child > div:first-child { display: block; } - &:focus > div:first-child { - outline-style: solid; - outline-width: ${getOutlineWidth(size)}; - outline-color: var(--border-color-secondary-medium); - } + &:focus > div:first-child, &:active > div:first-child { outline-style: solid; outline-width: ${getOutlineWidth(size)}; outline-color: var(--border-color-secondary-medium); } - &:active > div:first-child > div:first-child { - display: block; - } `} ${({ disabled }) => disabled && @@ -86,12 +80,13 @@ const AvatarWrapper = styled.div<{ const Overlay = styled.div` display: none; position: absolute; + inset: 0; height: 100%; width: 100%; background-color: var(--color-alpha-400-a); `; -const AvatarIcon = styled.div<{ color: AvatarPropsType["color"]; size: AvatarPropsType["size"] }>` +const AvatarIcon = styled.div<{ size: AvatarPropsType["size"] }>` display: flex; justify-content: center; align-items: center; @@ -115,70 +110,79 @@ const StatusContainer = styled.div<{ background-color: ${({ status }) => getModeColor(status!.mode)}; `; -const DxcAvatar = ({ - color = "neutral", - disabled = false, - icon = "person", - imageSrc, - label, - linkHref, - onClick, - shape = "circle", - size = "medium", - status, - tabIndex = 0, - title, -}: AvatarPropsType) => { - const [error, setError] = useState<boolean>(false); - const initials = getInitials(label); +const DxcAvatar = memo( + ({ + color = "neutral", + disabled = false, + icon = "person", + imageSrc, + label, + linkHref, + onClick, + shape = "circle", + size = "medium", + status, + tabIndex = 0, + title, + }: AvatarPropsType) => { + const [error, setError] = useState<boolean>(false); + const initials = useMemo(() => getInitials(label), [label]); + const handleError = useCallback(() => setError(true), []); + + const content = ( + <> + {imageSrc && !error ? ( + <DxcImage + src={imageSrc} + alt={label || title || "Avatar"} + onError={handleError} + width="100%" + height="100%" + objectFit="cover" + objectPosition="center" + /> + ) : initials.length > 0 ? ( + <DxcTypography + as="span" + fontFamily="var(--typography-font-family)" + fontSize={getFontSize(size)} + fontWeight="var(--typography-label-semibold)" + fontStyle="normal" + lineHeight="normal" + color="inherit" + > + {initials} + </DxcTypography> + ) : ( + <AvatarIcon size={size} color={color}> + {icon && (typeof icon === "string" ? <DxcIcon icon={icon} /> : icon)} + </AvatarIcon> + )} + </> + ); - return ( - <TooltipWrapper condition={!!title} label={title}> - <AvatarContainer - size={size} - onClick={!disabled ? onClick : undefined} - hasAction={!!onClick || !!linkHref} - tabIndex={!disabled && (onClick || linkHref) ? tabIndex : undefined} - role={onClick ? "button" : undefined} - as={linkHref ? "a" : undefined} - href={!disabled ? linkHref : undefined} - aria-label={(onClick || linkHref) && (label || title || "Avatar")} - disabled={disabled} - > - <AvatarWrapper shape={shape} color={color} size={size}> - <Overlay aria-hidden="true" /> - {imageSrc && !error ? ( - <DxcImage - src={imageSrc} - alt={label || title || "Avatar"} - onError={() => setError(true)} - width="100%" - height="100%" - objectFit="cover" - objectPosition="center" - /> - ) : initials.length > 0 ? ( - <DxcTypography - as="span" - fontFamily="var(--typography-font-family)" - fontSize={getFontSize(size)} - fontWeight="var(--typography-label-semibold)" - fontStyle="normal" - lineHeight="normal" - color="inherit" - > - {initials} - </DxcTypography> - ) : ( - <AvatarIcon size={size} color={color}> - {icon && (typeof icon === "string" ? <DxcIcon icon={icon} /> : icon)} - </AvatarIcon> - )} - </AvatarWrapper> - {status && <StatusContainer role="status" size={size} status={status} />} - </AvatarContainer> - </TooltipWrapper> - ); -}; + return ( + <TooltipWrapper condition={!!title} label={title}> + <AvatarContainer + size={size} + onClick={!disabled ? onClick : undefined} + hasAction={!!onClick || !!linkHref} + tabIndex={!disabled && (onClick || linkHref) ? tabIndex : undefined} + role={onClick ? "button" : undefined} + as={linkHref ? "a" : undefined} + href={!disabled ? linkHref : undefined} + aria-label={(onClick || linkHref) && (label || title || "Avatar")} + disabled={disabled} + > + <AvatarWrapper shape={shape} color={color} size={size}> + <Overlay aria-hidden="true" /> + {content} + </AvatarWrapper> + {status && <StatusContainer role="status" size={size} status={status} />} + </AvatarContainer> + </TooltipWrapper> + ); + } +); export default DxcAvatar; From 3d5fe3b9142f9f111eaed068064566b82eda9958 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Fri, 10 Oct 2025 09:26:18 +0200 Subject: [PATCH 20/22] Add new vitest and storybook functionalities --- .../lib/src/avatar/Avatar.accessibility.test.tsx | 14 +++++++------- packages/lib/src/avatar/Avatar.stories.tsx | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/lib/src/avatar/Avatar.accessibility.test.tsx b/packages/lib/src/avatar/Avatar.accessibility.test.tsx index 0bbf43612..27c161f6e 100644 --- a/packages/lib/src/avatar/Avatar.accessibility.test.tsx +++ b/packages/lib/src/avatar/Avatar.accessibility.test.tsx @@ -1,36 +1,36 @@ import { render } from "@testing-library/react"; -import DxcAvatar from "./Avatar"; import { axe } from "../../test/accessibility/axe-helper"; +import DxcAvatar from "./Avatar"; describe("Avatar component accessibility tests", () => { it("Should not have basic accessibility issues", async () => { const { container } = render(<DxcAvatar />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); it("Should not have basic accessibility issues when it works as a button", async () => { const { container } = render(<DxcAvatar onClick={() => console.log("")} />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); it("Should not have basic accessibility issues when it works as an anchor", async () => { const { container } = render(<DxcAvatar linkHref="/components/avatar" />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); it("Should not have basic accessibility issues when disabled", async () => { const { container } = render(<DxcAvatar disabled />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); it("Should not have basic accessibility issues when status is passed", async () => { const { container } = render(<DxcAvatar status={{ mode: "success", position: "top" }} />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); it("Should not have basic accessibility issues when image is passed", async () => { const { container } = render(<DxcAvatar imageSrc="https://picsum.photos/id/1022/200/300" />); const results = await axe(container); - expect(results).toHaveNoViolations(); + expect(results.violations).toHaveLength(0); }); }); diff --git a/packages/lib/src/avatar/Avatar.stories.tsx b/packages/lib/src/avatar/Avatar.stories.tsx index c57c082ca..232a10a4a 100644 --- a/packages/lib/src/avatar/Avatar.stories.tsx +++ b/packages/lib/src/avatar/Avatar.stories.tsx @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from "@storybook/react"; +import { Meta, StoryObj } from "@storybook/react-vite"; import DxcAvatar from "./Avatar"; import DxcFlex from "../flex/Flex"; import Title from "../../.storybook/components/Title"; @@ -8,7 +8,7 @@ import AvatarPropsType, { Status } from "./types"; export default { title: "Avatar", component: DxcAvatar, -} as Meta<typeof DxcAvatar>; +} satisfies Meta<typeof DxcAvatar>; type Story = StoryObj<typeof DxcAvatar>; From 668135a3c1dda7bb29ee14da4caba5ff43f98276 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Tue, 14 Oct 2025 12:27:20 +0200 Subject: [PATCH 21/22] Added documentation for Avatar --- .../components/avatar/AvatarPageLayout.tsx | 6 +- .../components/avatar/code/AvatarCodePage.tsx | 12 +- .../avatar/code/examples/basicUsage.tsx | 2 +- .../avatar/code/examples/clickable.tsx | 2 +- .../avatar/code/examples/status.tsx | 2 +- .../avatar/code/examples/tooltip.tsx | 2 +- .../avatar/overview/AvatarOverviewPage.tsx | 217 +++++++++++++++++- .../avatar/overview/images/avatar_anatomy.png | Bin 0 -> 34004 bytes .../avatar/overview/images/avatar_colors.png | Bin 0 -> 55559 bytes .../overview/images/avatar_content_types.png | Bin 0 -> 59378 bytes .../avatar/overview/images/avatar_shape.png | Bin 0 -> 27848 bytes .../avatar/overview/images/avatar_sizes.png | Bin 0 -> 41858 bytes 12 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 apps/website/screens/components/avatar/overview/images/avatar_anatomy.png create mode 100644 apps/website/screens/components/avatar/overview/images/avatar_colors.png create mode 100644 apps/website/screens/components/avatar/overview/images/avatar_content_types.png create mode 100644 apps/website/screens/components/avatar/overview/images/avatar_shape.png create mode 100644 apps/website/screens/components/avatar/overview/images/avatar_sizes.png diff --git a/apps/website/screens/components/avatar/AvatarPageLayout.tsx b/apps/website/screens/components/avatar/AvatarPageLayout.tsx index 86990ed5c..d3d4ce42a 100644 --- a/apps/website/screens/components/avatar/AvatarPageLayout.tsx +++ b/apps/website/screens/components/avatar/AvatarPageLayout.tsx @@ -15,7 +15,11 @@ const AvatarPageHeading = ({ children }: { children: ReactNode }) => { <PageHeading> <DxcFlex direction="column" gap="var(--spacing-gap-xl)"> <ComponentHeading name="Avatar" /> - <DxcParagraph>The avatar component...</DxcParagraph> + <DxcParagraph> + The Avatar component is a key visual element used to identify users, teams, or entities across the + interface. It helps create a recognizable and consistent user experience by visually representing people or + objects through images, icons, or initials. + </DxcParagraph> <TabsPageHeading tabs={tabs} /> </DxcFlex> </PageHeading> diff --git a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx index 074199542..b0442f658 100644 --- a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx +++ b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx @@ -31,10 +31,14 @@ const sections = [ <tr> <td>color</td> <td> - <TableCode>'grey' | 'blue' | 'green' | 'orange' | 'red' | 'yellow' | 'purple'</TableCode> + <TableCode> + 'primary' | 'secondary' | 'tertiary' | 'success' | 'info' | 'neutral' |'warning' | 'error' + </TableCode> </td> <td>Affects the visual style of the avatar. It can be used following semantic purposes or not.</td> - <td><TableCode>'grey'</TableCode></td> + <td> + <TableCode>'grey'</TableCode> + </td> </tr> <tr> <td>disabled</td> @@ -42,7 +46,9 @@ const sections = [ <TableCode>boolean</TableCode> </td> <td>If true, the componente will be disabled.</td> - <td><TableCode>false</TableCode></td> + <td> + <TableCode>false</TableCode> + </td> </tr> <tr> <td>icon</td> diff --git a/apps/website/screens/components/avatar/code/examples/basicUsage.tsx b/apps/website/screens/components/avatar/code/examples/basicUsage.tsx index 466b9b8ab..c38a26051 100644 --- a/apps/website/screens/components/avatar/code/examples/basicUsage.tsx +++ b/apps/website/screens/components/avatar/code/examples/basicUsage.tsx @@ -5,7 +5,7 @@ const code = `() => { <DxcInset space="var(--spacing-padding-xl)"> <DxcAvatar label="John Doe" - color="green" + color="success" /> </DxcInset> ); diff --git a/apps/website/screens/components/avatar/code/examples/clickable.tsx b/apps/website/screens/components/avatar/code/examples/clickable.tsx index 13f048ad5..a72c07b00 100644 --- a/apps/website/screens/components/avatar/code/examples/clickable.tsx +++ b/apps/website/screens/components/avatar/code/examples/clickable.tsx @@ -4,7 +4,7 @@ const code = `() => { return ( <DxcInset space="var(--spacing-padding-xl)"> <DxcAvatar - color="green" + color="success" onClick={() => console.log("Hello")} /> </DxcInset> diff --git a/apps/website/screens/components/avatar/code/examples/status.tsx b/apps/website/screens/components/avatar/code/examples/status.tsx index fce223ee3..9fd0aaae7 100644 --- a/apps/website/screens/components/avatar/code/examples/status.tsx +++ b/apps/website/screens/components/avatar/code/examples/status.tsx @@ -4,7 +4,7 @@ const code = `() => { return ( <DxcInset space="var(--spacing-padding-xl)"> <DxcAvatar - color="red" + color="error" status={{mode: "success", position: "top"}} /> </DxcInset> diff --git a/apps/website/screens/components/avatar/code/examples/tooltip.tsx b/apps/website/screens/components/avatar/code/examples/tooltip.tsx index 6f165b3d9..aea884a5f 100644 --- a/apps/website/screens/components/avatar/code/examples/tooltip.tsx +++ b/apps/website/screens/components/avatar/code/examples/tooltip.tsx @@ -4,7 +4,7 @@ const code = `() => { return ( <DxcInset space="var(--spacing-padding-xl)"> <DxcAvatar - color="green" + color="success" title="User Name" /> </DxcInset> diff --git a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx index 28cae5bf0..145ba7583 100644 --- a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx +++ b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx @@ -1,11 +1,222 @@ import DocFooter from "@/common/DocFooter"; +import Image from "@/common/Image"; import DxcQuickNavContainer from "@/common/QuickNavContainer"; -import { DxcFlex, DxcParagraph } from "@dxc-technology/halstack-react"; +import { DxcBulletedList, DxcFlex, DxcParagraph, DxcTable } from "@dxc-technology/halstack-react"; +import anatomy from "./images/avatar_anatomy.png"; +import shape from "./images/avatar_shape.png"; +import contentTypes from "./images/avatar_content_types.png"; +import colors from "./images/avatar_colors.png"; +import sizes from "./images/avatar_sizes.png"; const sections = [ { - title: "Introduction", - content: <DxcParagraph>Halstack's Avatar component is designed to...</DxcParagraph>, + title: "Overview", + content: ( + <> + <DxcParagraph> + The Avatar component represents users or entities using visual identifiers such as icons, initials, or images. + </DxcParagraph> + <DxcParagraph> + It ensures consistency across the interface and supports various states, color variants, and contextual + information like user roles or availability. + </DxcParagraph> + <DxcParagraph> + Avatars are typically used in headers, navigation bars, profile cards, chat interfaces, and user lists. + </DxcParagraph> + </> + ), + }, + { + title: "Anatomy", + content: ( + <> + <Image src={anatomy} alt="Avatar anatomy" /> + <DxcBulletedList type="number"> + <DxcBulletedList.Item> + <strong>Base Shape:</strong> defines the visual form of the avatar. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Content Area:</strong> displays the main visual content. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Status Indicator (optional):</strong> a small color light that communicates user presence or status. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Label & Sublabel (optional):</strong> textual information placed next to or below the avatar, + providing context such as name, role, or email. + </DxcBulletedList.Item> + </DxcBulletedList> + </> + ), + }, + { + title: "Variants", + content: ( + <> + <DxcParagraph> + The Avatar component is designed to be highly versatile, adapting to a wide range of use cases and interface + needs. + </DxcParagraph> + <DxcParagraph> + Through its different <strong>shapes, content types, sizes, and color options</strong>, it can seamlessly + represent users, temas, or entities across various contexts, from compact tables to rich profile sections. + </DxcParagraph> + <DxcParagraph> + Each variant ensures visual consistency while providing the flexibility to match the tone and hierarchy of the + experience. + </DxcParagraph> + </> + ), + }, + { + title: "Shape", + content: ( + <> + <Image src={shape} alt="Avatar shape" /> + <DxcBulletedList type="number"> + <DxcBulletedList.Item> + <strong>Round:</strong> the default option, best for personal profiles and chat contexts. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Square:</strong> ideal for products, organizations, or abstract entities. + </DxcBulletedList.Item> + </DxcBulletedList> + </> + ), + }, + { + title: "Content types", + content: ( + <> + <Image src={contentTypes} alt="Avatar content types" /> + <DxcBulletedList type="number"> + <DxcBulletedList.Item> + <strong>Default icon:</strong> generic placeholder when no data is available. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Custom icon:</strong> allows brand-specific or role-specific icons. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Initials:</strong> displays user initials. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Image:</strong> uses a user or entity photo. + </DxcBulletedList.Item> + </DxcBulletedList> + <DxcParagraph> + If an image or custom icon fails to load, a fallback (initials or default icon) is automatically displayed. + </DxcParagraph> + </> + ), + }, + { + title: "Colors", + content: ( + <> + <Image src={colors} alt="Avatar colors" /> + <DxcParagraph> + By default, the first avatar uses the <strong>primary brand color</strong> as its background. However, the + component supports multiple color variants, which is especially useful when{" "} + <strong>differentiating between several avatars</strong> displayed together on screen, such as in team lists, + conversation threads, or collaborative views. + </DxcParagraph> + </> + ), + }, + { + title: "Sizes", + content: ( + <> + <DxcParagraph> + The Avatar component is available in six size variants, each designed to fit specific interface contexts, from + compact data tables to prominent profile headers. Choosing the right size ensures that avatars maintain visual + balance and hierarchy across different layouts and use cases. + </DxcParagraph> + <Image src={sizes} alt="Avatar sizes" /> + <DxcTable> + <thead> + <tr> + <th>Variant</th> + <th>Size (px)</th> + <th>Typical usage</th> + </tr> + </thead> + <tbody> + <tr> + <td> + <strong>XS</strong> + </td> + <td>24px</td> + <td>Tables, dense lists.</td> + </tr> + <tr> + <td> + <strong>S</strong> + </td> + <td>32px</td> + <td>Headers, compact cards.</td> + </tr> + <tr> + <td> + <strong>M</strong> + </td> + <td>40px</td> + <td>Sidenav bars, user previews, chat threads.</td> + </tr> + <tr> + <td> + <strong>L</strong> + </td> + <td>56px</td> + <td>Medium cards, profile sections..</td> + </tr> + <tr> + <td> + <strong>XL</strong> + </td> + <td>72px</td> + <td>Modals, profile headers, featured content.</td> + </tr> + <tr> + <td> + <strong>2XL</strong> + </td> + <td>80px</td> + <td>Large cards or highlight sections.</td> + </tr> + </tbody> + </DxcTable> + </> + ), + }, + { + title: "Best practices", + content: ( + <DxcBulletedList> + <DxcBulletedList.Item> + <strong>Use avatars to support recognition, not decoration:</strong> Place avatars where they help users + identify people, entities, or actions (such as in chat lists, comments, or team overviews) rather than as + purely decorative elements. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Keep visual hierarchy clear:</strong> Use avatar sizes consistently according to layout importance + (e.g., small in lists, large in profile headers). Avoid mixing different sizes in the same view unless + contextually justified. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Maintain alignment and spacing:</strong> Ensure consistent padding and alignment between avatars, + labels, and sublabels to preserve visual rhythm and readability. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Show status indicators only when relevant:</strong> Use status lights to communicate meaningful + information (e.g., online/offline) and avoid visual clutter in contexts where status is not needed. + </DxcBulletedList.Item> + <DxcBulletedList.Item> + <strong>Use color purposefully:</strong> Choose avatar background colors that align with brand or semantic + meaning, and avoid overusing color variants within a single view. + </DxcBulletedList.Item> + </DxcBulletedList> + ), }, ]; diff --git a/apps/website/screens/components/avatar/overview/images/avatar_anatomy.png b/apps/website/screens/components/avatar/overview/images/avatar_anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..52836fea0d5e2d92c37eb4d895cd4d197ecc8f41 GIT binary patch literal 34004 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 z�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 F{{Vt=>)-$Y literal 0 HcmV?d00001 diff --git a/apps/website/screens/components/avatar/overview/images/avatar_colors.png b/apps/website/screens/components/avatar/overview/images/avatar_colors.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d00bc81c1b7286766fb1ff6aa1c2cad6b21762 GIT binary patch literal 55559 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ℜ{V4<MTi@l2#`I}@wnc02fe~<DcI8w=uIs2!q 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 VR|0Tk>^(m4vNW?btv2?E{|AE+BC7xZ literal 0 HcmV?d00001 diff --git a/apps/website/screens/components/avatar/overview/images/avatar_content_types.png b/apps/website/screens/components/avatar/overview/images/avatar_content_types.png new file mode 100644 index 0000000000000000000000000000000000000000..66a8a09db4a06eb6fb6699f67ce1dc4f71caf0a5 GIT binary patch literal 59378 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 literal 0 HcmV?d00001 diff --git a/apps/website/screens/components/avatar/overview/images/avatar_shape.png b/apps/website/screens/components/avatar/overview/images/avatar_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..6442ef3eb6aa38aa8b1760a5e059402dea735818 GIT binary patch literal 27848 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 literal 0 HcmV?d00001 diff --git a/apps/website/screens/components/avatar/overview/images/avatar_sizes.png b/apps/website/screens/components/avatar/overview/images/avatar_sizes.png new file mode 100644 index 0000000000000000000000000000000000000000..f9fa805568f8b23d431f5b3bc0d541f168493c5f GIT binary patch literal 41858 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%0A*P&UkMeMCUnSQoj!!O{#F%kG_TwOmSD zO5F9ysu+luanNw%woc6u8GHoK?=#o!a7)ZIem7c}ZLlv><a63PC2^djgaptvoB^$< z+Ql20^FYZP9Zu~kDD|-?d3Lz1#gOnNlmOSs5$|a~-uy9f{lKM47{+^RbxBz!Ie7fh zU~_9$=w7cM95h`{IZd_9x-<;lwl0<9<I8%EPyNM;PWqCS737B1VKh+SQ`>^ZN|$GW z>Mb7JnOmR(QBFEMB|?=dA`kqi=DQ&_%DgBq@vX~s^`(T661o_>@`LY2)n0SdLI>m* zJy`L40Ax2suxHuKBSaOm7a2HYvY=BOlNySANnWam+4?l}tb8g)nS0nSBaHPW_VU9n zDi@W4l#q~U-*G-q(a~4CHciSKhpLu30X^{AK^V2lI(m`d5s>Qc@oGb)d~LNx^<;|d zxS24b`{OJVnkm%jRz;tQU>3x%s(z2$RCr)BsPIhPLI7_-Ao8(-PQ(KFlC>Xy_UbND zw?WNeS(Gm&Ug^E0bt<ezYtdtEg90)E9O%KIbIKAG0}vS6jywg@M4hIZfMw(#rik2O zK5Gpd_jw8?5>)(L1J{v(U~)uUzc$40P1sKE;aoi@kpzhi?suSMeg0U(0!kJbd}!o; z%P{`bfp=k^vD1DwFsQ&d;tM4`28iLT<Uky)LtDC{9YnAxI}S>}YR_^P+i6P4H8xo@ z8zLGW0M%bWQ?cI~8X5@W)a-s{EuU%~H&}-2H7A)-DE}=rP<ksYoKrURgYq?q-g6qp zdt}6&SG&)T6#XH@HphBYxxT}uaPBsI>#YaflV-g{8knXDM<6Wz7)3G^6kD)kL!&_{ z00|GZfhgy*i`m$@IyJ6R{DZEvTyxEltYeoQpg0I$5ZqfM)BM(?vb&w6m{sUGR}E4l z^!lu)N)1zRy{ql(tY{gaTHTdji%6ggs64n%V4Thf9x!rZS!}^3<&2OscnXy?13+x8 z=VTwLCev7hXS1M`fk%VQ>bYFkZK4n~m(OgeLA~igV#TO{jR=%V(<OnH1PCqHdueK) zb?gS(M?$`S0i?&<0`9jwt%s;fgJqB^H=7wa43jU}eD+>tK@VoQQ?L6?K$%-+&0JYf zl`S-QgR9EjwIVnA7({1HRmGxebnM#as!8}cmNF`S`~Qr!JgHT0K;THa9q$4V2>@JA z7biE3xmQX;$7#(RZMEsJ()~4$ZfCoF>Q7C#hv=EJ&qD14&;``Gyi9007wkwCP;JX4 zg}REK9CiQEbC5HQe*IapSFpN2;1lGnATjD`B~7>n^?46%-n*Uqt#uK@m^6i`$i$Q` z6Hl2`-LNS%+K#}evMzVs7&cSGIX=5|!@B<NNT0yTwCC6J0f@yjKXdZk_^!>-d224( z%&&+#S_B#t(XyV4gG6Nl-KwN&y({9z@pWC`o|2{!SkTIh#f%=13EP#yC|n1<q<pjF zg^;Q9awFG$3sXF@;ZMqBJ*AgKBuck(0PZ;?9C55SX|JzD5tzXOg#D}PIslt#Mw)$P zTZbADy&eJyk)2zyDlqY&W<8fR#Eg#X07NFoNcD`SHn<6pZJq#Fb1&=cGD|bGQ9P#w zoi3ZCn@T~w{X(OQ4xopXRY0SQ&)K*aL?Dg!MBLQ#5Gf4H>f?{RWmxUidb~m{aWEZ= zrasVl6OnPd(MS12I%bD}01DSNp!fparUtz4g-K+UTUB9IFy>E=#?@#KgFVua7uYSK zpPHs?H=dN7Yc(g`6^aQAH<%dL@MUGBc1S?CXBDt}rkvh3#~$+=r}hKz>AN=t{}afk zEaI|EerD!6_#4}&5Pk#t8-s<U)0{ujW^5p*Li`r=i{4btiLBc)51SyHXEFjxh8-Ae z%t1Fc0Cr$~lhJafATMHR7}d$`D!?Mvn10oGqBj!4ZB(C%4<C~w>Tbko=TYi$M>7=6 zz-$qiijl)F{yC?kR32Lyvrqf#>MbSxkM%5|*slS?caiPv07%9q%cs(Ay6)V)r{h01 zFi^fRT2oE{T2{o8d3iwr0sP!|-%FCor*ADYf~JE4^}BciG;JvL?UxhfTsyZXGSg$w z<DS>pn^MbY&9tJGHagYmmaN)k^i%hO+>sID(+p>cj<>j-EfMV($=vm^tnkRp3<baD z84I_#yhf&ubcP&5e@FTJCsSuOZh?UW&F@b<Uhg{)7NCeg+|OXC_C~F98<6@nDDuPA zv0U!~jxp`#*;;i!=~U&%J})qkboXiGw-=Lut4f!ZNJHe=$Ubd&yFor3yJ{P+lU514 z+h7Z~#M7{aE++mO?{d<JDQT?IpzDTNC_U%5J`^asxhdX}3&h69$l_7ZGk(wB6>ugp zrs9ZVHvE;w$cocwyf}pf4qa(Wr%?Zk$|8{05S`n7FYC~mgM|uRw%a@zk?<Wmy$DCv z2wUK<t{!t5Re^QyDoWHx?y{HDuYXK@(s<Wjag>3)8zkmE!GqjR+_7kvo1MyT8eHNp zVBnX0?7^{gNhirtk$b<OB4`rrxGaZ~Y$k^R(zsy<CPQ4?=RYdMuscbIYZ-cjYL(`z z0VlPAq|LJVelGS_2`x&a{pP{33D0uXluooO#r;6;G)a#Q*UG#;;Z7TqIk1)j4oGIZ zzBkeQBa%Nxq_ZU$&1`^LU0SiLlD;C>Ej4^yL>49m+EeYhH{~q%%(^A^r>954!<ZeO z<vv}{nbKI4>yq;NP)MyG&&R6{9~*ntLFRC8>VCzUNx%L*8OEsLuh_Pawns?&v0ckS z{Jf3(6|SW4Wcto*?q0NfFmdXH?|18tLQ~k%8VL9~`db|(*GEHEnofI9YFWuS4STw6 z2e8m27K;6~z2x+U<qw&(_UNhUJIm~>DLz7bDc{e*6kb*?Qg%*Y4kLuEQOGRkZE*Dc z!oCPFr3N}efL=7^Zh}AmL}*CRX1;ic`Fl|7h>bAB9DgJBOWW|K+4k%jkR=#*zfS#U zZow&Ycjdv)bSkzWra5+2Hx<1nIwC)xNo#!tG!VLcB1+Ty+YScH@gGub{ApSh4q3e_ z)1W6XQS84%x1{Uees6eQGU79x10{Tjcj4m^gFUdW_Hrz*VoKJ3O7Zo9mg-sh<v*)& zR|w(hHZaq?xr60ngx(CbbFPTIb#im)r3NKycky~o{zf68qV|mFxvD-g+!H1&T%4{y ze7LeSLszPD@}gfHJBFamAq(ABcL}C-Tp4D|<;TRKZ+V6gz<wX(H@T^JlexzV0al9o zsdT<Tm7R8#v^rxwK0y7M%o!YNhFt!$GXlORpdGnE{3)ekTYSvYFnbTUAC-c<kwIPg zaWCXp->WX3Fe8}mBy5p8Ym~kteX>GZb~7rH0CICNlM3oH=8t{PGqyBq65@+*q<jF1 z5Uc#v7q|VvWETjfH`N8Y`UfrWEHsHpBc9<DmiNK7#gn|U1kb&F+odj)?s(qHv2k<t z=G;;)C*!%)6qof=44%w2yUH$knAR5msh!!BarB1J4D@^yd-U)IXZX7zkf9#QeO&`R zIfW5pTE+s(+*I!FQ%bN6YlIhOkrDE8qt)bnn$F92L*ABdW$ra#LK^7N)nK4A`-5wH z?=}z;lH!xNf5OW1kv{47Vupe04?m|Q>~8tOcShu8-p<`3V*f_YcZV9>r2L&aDOG%V zrx`?9<&2w)qQ<@rrtQ|^JU?uf-{((xJy#!wdl!NRHXj}?3$9^>9H<5`cNSIFK?SpF z=|8+a_?E6RPQS*nPw%{nC-oF+F1TXPxt*QaM9LN;k%An^mh(<8;!SLMir#vF5tLg0 zgW#Bn`}~-r_{w0nN7cf|Z$F4jn_LBf-dRWMVc&FJA1WUiDY0Jb#O6QgY}$mmoRsH| z3Bjf0##`^UhT+?tPqV;za&B4I`gAA@WNsdAW>V1NH=D$sUS%s1bA7Di{vq+=yzZ+O z@1`$E?S_!F;s_4Pw1wNpI;!o>lQlKpAmR?W<5F+91$QStS(Iu_#IdIEt$dW7`as{L z)(0KFy<KSLyRWv!S78=R=Lv$Y@4Da5`cuH6U21Ydoi2*R3x1D^zR(oM{$m43A94!5 zIS&(YhXqMG*;|Ke+8@H5ftaH#*7|0+$++?2Fk|gvXls+yt1{OM-oSeS7r82|Bnhf8 zVOr9(7dJai)7D1AMaM`$g{INeZf`mNop5b}T<bLPPr;9~2ac0^0CTt{>EFC_(t0BP zxcgRCJi<!O_;!Fc={UFItl2)(^Y7WGc(PBpANhngN2!|hJKo?nQkID5l5t#*jU+@d zuSpu6ZTMyLwJvOppTqgVB?Nua!s+3c3@-T(v6+F)1--W5O5lGec&Mge>gVbKC@Fib zXDDa-(0=%F+BC}64zoEHOiZ%M`P+yxct&{Q1#1foI_o7T(Xz2iZr_ZPgdujO9Q9aH z;fACgFo~ki`Cgh^$oVMi!fv9$>^WDeqTS4kT8a+b`Hgs$w6vNGd&u5#4}r{luL!P< zkg{@Lz@2H*QbfO12wb}mTM{4WV+ES^r;qTACJ%}wvXEYwz#^h&|1;hM@?t=yvQ_XZ zuXqFh80hG~X%uVKm3niY(@BN9;No(Z^y=bNa2i31rYE+-4|bNXp7Rc|@7GLO2I=4Z z2lDXktDop<h$cX*p}4qTQ2F%d^}$Wv&-G@w`tc$#J?@BlTXE?7YK=zr(9O#FDAx^u z{lsMY>qwscBAPRYFOhT*$E4o8I!vLkT230Ty784AdNB!xG$y@M;u&UXSgcqHxU^07 z$gFugj3I!jBNgqPRPB%Ub(Q9P-BfjQruB^m`g7!|qV4FfXPwx><^z^bv7AGs0Vv*R z_f=u4%42T(u?}C0w)C)1vNRa8pz$%<ICs`34}i3Rp1`Z%+vM%t{{YAcht2tm(T`Vo zir!=1HOEe!f3_<sMmkX?kZiXp>MeMqEDs%ZxKqY)Gbxhrl^J1r1$4zOmCRwB*N3vo zf!I{9`TD2soridIyQF*^xGI@N`hE{rhz{4|;#YENu5MzEH(QTr_j`$;VgH1~vrd|u z#{$l0D2SLC$^r2bTmi6)trg)wlC~4}QOX{SQm71jMRKmFoJj0un5Cuk>6tP=pDXjC z(3@qXS?BhP-AkS8UMBnyC9~m+%U8YNFkw!wgt2r{%9~o_Pfrrq#Te3H6IGUf%xfeo zVc2Mz1VgALFa&MhoW?TzmYToC)bFI!07eCbM9`h%8uGCRO!H7}J#Ack*&`H_fqDLJ z{ty7JQ$G*8ejN-v1|1wNjWc90b7UWU4DWNR0`3s$83)`U${Xh4H)RGnJwXSCK-pT$ zZ!B7oUC-7?@YAkv6HYw#Vm&@UMy>4x4L+KaCLL<M*9D*7u}(W7--=jkJfSeGvX6Nq z^e5nlKp~2%mPi=#o@!O3HXN@c%xO5DeANI5*U8ZkA*1I!rv4Gl-9TH6TX3LNx19CV z__d~uDG!&6(!-r<E*^Ivy7L@dP27$QWi)B(a1T)82(4{^XGBlWu_gQQ`sF;tS$Y~f zN48B>P=`Il8eUXT$~MQRsA~1DRin(F586O{JQlTf1QOTk()tJ}md*REU8ulH)w1%E zpoiUBc1Pkx?hTRg;i+n`%J=k^YrNhkm9~@h#9rXblUn<p4$o*^3M$GN2Dc-&UI$mm zX_R{<zfMkfI9n!>BLWOUalKZ-Q;jZO1^pZkb>!KJu%3TTP!|^NCAlY)GLoL;Z0_G- z7@PT!-4Q>KAgRm;i=#S1GSCa1z+z8{xWo%T==%3xCteaiEfL;O9<c+^?c-A^R6<F7 zR>zJu*3-0xHr)YQb+jQYeV-js+MuNk)y>CBt=!fWUeKv)=?CUtpkt$VL>{d;_U+7; zM+exyoNqn-a<BcLGS0gY9ANcoF9L3<>GPR#r@QI4ZOFNL;lX7cPe9FSnr_DUi{x>m z0$ECiR%q_5+vUCw>Gri3S@_r44op78t0ITw!&olPzVLqAH1TO}LvQseWa_78AoH04 z>}W-CIJQrj2xd8R5fPW%o)wvyG?7%d`cV2blmHr@YCoB$`n}1V{d#4^Gs^8EJ>a6I z5EBIjt`w!^+OsgI7)a1FZk1W+6TN}%ntyYQj_-ROigi6MWmF<OO94>^c#HF-h$L65 zpyIOkwkPOUQ(TFF;)5wLAj#K^rJr-l-a0#>!c*h7e+)E%-BO2va^Yy1cXTutvpd9^ zBCcfP&n>jcH0tJ4&KtRZ+dW#UtJ1HlfwxE=<F>?f`Wg((H-KS@jrT{BTzxQJE57#S zd(Ev1b<jW<psxQsY@Kg8@t&~z*DOFH<of6=Pik}RcRs~AP*ht^t<el}(Q5E=2_n|N zIGm?XSqOj#JLmV89A5*pF5^3T`hz9td)GTN67h1R2&Jvb)aysyOx!M2x@F{tysg~p zSk|IEk@9ZPw7jz1y3s6_F$uPDXGdrm=+@2-lj)qn;!eaqqKbA@@a}8XMkT+UTcNVl zrzm#ab+JPoo%EdXx-;bxqq*nexHPTQvbO|}A2c4vZQR_n<!Gv`tLk>Wf%j}8Scj;4 zVe`$Hi5@5|_!1E5yZet8NntRica`m{N2R<T*`$KjT|vM7?9u2Hb!^UD<a2EWYImd5 z7fegEf>%{3_HfRea{td~UN-v`Wu))}h4t_-mI|WO4@sY!&z3H3&TU$qEs(H14`L*= z`<h`8ZJK@kY|X6x+!yL7Ag4gc3akwxyK|vOkLF-Hmo2W(4pje8)`+8wDp0o(+x66) zOr;{kCWe|^Gz|VN2~#+RrqTb%A_Mi@HYP~CXsxq%sHaG!Qm+MAYO8D9(e!%O-HwdV z4D5Nnfk}>oOA3AxLqeH!6fkvJnTyNRyd9m^h@#`9(1r2a5bS3IKD{&E(B|{iDA^g# zMs;<buADB3+$~ChUwacMt5S6YUT6Sgj|X|i(qD~>l?9tG^7R(_*#260I75nBy>Yt7 z5|3GBgTl)C-C$33d^_QDx5~AFQ)L3PAx&h+2n^ED$YtZ6{q+SfhE<=&*<6Wv@ZTDk z#)@CRfrS&(FiK{Dm$ngL&YHoQaSLA!RB{wE@xgQn@Q%RK*lJ@jxk)f&F48zoUg!e4 z29&hnxIXSAvWuc_P<Jq1!Cu(qUD9~fMj~lvUSX$&;1#^Ce4}mlIfJKT9*f|Y$vG!5 zkK2Wqs^@*vYTdof_Jm;W*KerNcyHu*OhQ_{<OjemE?kwE@~za!3SRWs{tw@em^yC{ z1_9Qsehw?#!d`LD*uR_VvQs3PuUG?ws`J5)J03s~3k^QzaCpVqZ(UgU<1e;IyxZX{ zH+<(%-0lc#G|{)52&zg=uPuvtTd~_U+bb73Dt>ljw@e1l-Dd#`H!Lyp)tTx1xl}(P z040=s&r9Myxi86hc|Ih5y@~#?RLN)Fe$aa|+l_Myz1u>dZgsb1E$wh4DoKO&RMyy3 z>RgAt3w6@xk{R*)@TTAWd6woqe&3F<-4L@Ls~5-aHwattzN>%oVj6D+r%-Jtd|gV~ z+i*|ikI3)mm%H6>%7^Wvi2`A`j^W1Uk*)J*?q!Q#Utuz$ZFYxwrO|%y<mqn@jqvH! zizYyqUgec1pT8F<%&`$&gr399`G0b1Q3UC4r(`-6TA-oP<v_V(DqOE+o2CrN(sdcb zXtAEhyu9nvv%q^fm)_ly=Ci-ZeMxe8I_$>-g+m|H9B0;Y^=oUk!G_pl6R3FfS?Z!$ za|e}>nb1T5r>^}~J{m<P)wq^@h@DzmU5nnE7|Mom_5<z2bu%?Id6`?eK5CC2=dfHk zQgh0z^iAh+C&0AVgMC^M6`K>tGC;R?mp2h60|Nt6YmL+zFyTXRQP#?aSy=EmzS@4} zcoXE)V`Xj*Zbvfu>t=Opk{4~wpojhBi=J8%Ko=6+Mi~Rd5)gWV%#4r6SwC-2EFjHb zz%mJ0)m4&nPv%?M82Gm*+}F8w1!)5<!J;fMfL}r0r;tn!*#qiQj{drT<EU+IeVy$3 zL&4gUDq5V9<d)cc9?mTlsrtI%<QXlG+ZK7;%on+%=^<xxCL#}@uSK7?t@=M3&X&!H zQiU$dW|`skemeY);%;+w_5!X_U}JX)NmaQvPNI?#xHp=V?$p67`HG_|*R;sgUG7ZD zQSl0;D6JUNy|C%8Uzp%P;(Li3cOP}<C-s1_BFnvn{kvfH?#;bs$0nOsW!RF0G}c6M zY7O9=HdGqb^zZ^xY?E9c!m}Q7E)NpzQ?55N8fU8Q@A{K+gBi3}K_1=VpuPZum{zU( z79#gJ8V^b+XgQ75Qo(fzaBD((B@!Hi7Xow#5VFKzB-8l9c`n<x2MBe696=NcSLKW` z{|_aWhH*Xyi%;*Xh_NDb7VJH3(Q5UjNxt()=6a*D!~EP9&-yG5IUiogvAwVG6mD~} zF*6(nCTRQdaP{vt-P4gBLJWqCt9ZD-z}g1k&?oP*QCn8Ik)}~0PABS$NF((pwb&DZ zc8SK-exbe@OLG|<J9plhQDx*<x?~pH?Q;S5c~T$f9Q|<AQcYd+nN5O_bJw*F^(#iY z+VA<dFKB5oO(#lRzJH!~VK3vAY}I406;=CK3JYgm<bBPyTVNN7Y+U<PFwSz5C$iBF zibigFW8;^-<XAYbP*x@!A|XhI4$_lOv+Z_GBxIM|-DoDF+%;IFTP9fA)d9<3T9{`$ zP$V|&+K-;BMlLHjZ>;+`p?7yf84*aNZY3^%uMm^V5c0r+DzDb3cW@Fyjxaf{V3@m$ zCX<LFwOfyfYj_0p@nVme@YFE1e_R+rsAog?;g(773Hpk=?DueJa|8G_W8uZt;wo{6 zYQOaD*j1-QzvZT8OWQJaWGDxmI?Sk<mzbpYF0X&vcCGlm;S5o{*L5r^FHiVT)qB#? zp!>wc|7-6{<DqQ-zA2?rREn!bN{g;+mFx`Vk|dPKI;O?GW@{`n#!@7=6xo?cLWP;E zgJGzwVaC$XShEhsV2r_xS?*K!b6ub7{yhJ;&#TA0ne)Y*$9epg<NNy_-}5|wGhqmw z<j=(bH%`PFLuYGWu&cVf@fM*MDDLpLZrqp&>`ukgcEwE~%&a>|VxRr<T;?IWMrn3y zrFB-y#@UnM3;jW7OR(fS%FC6fJY-`SeX>wkkS}e$4CCaZ1zg>WTj6V1<Q0Q^K%;2{ zT)+)n|1%BE3l2lCl%r&Zo}`xUbN<xeO}q%-=-6n=Le~t@$hr7?_b$Y`-ys#H2ko1| zz$pbROLZiO7qUvhYIEYS{M9x|2#mgFcF)5Ur10B(k_#2FTNeMa{xQ!Fz5*MiZLH2~ zF12FC7V7wqRSe}w3?x|CmcL!gcdbu1)7hE3yr;v0*yJ6sZaL*H0RBYEt{Z$HK(kY7 zIyg7sM`fAQJh70|Y3n|v$p(UpBA*O?uBk{7T4W4j46zS)*di?(aPJ@5*e+y;3)DdM zRXI|Gml?0I`%EahSy<qi=*jP7jz#bMK1v;QeuGwq=?rPCVbj-J#Il9Jy5lMp(BADt z*hJ20tj;ngw_ZIv`v+%OA5uNg+*seKc#2zSmCqZx$K_2X5G*1T+;e$mBkEiSy7r9r zde!1890)Ro=VPaxu{LlmjF}uuvIJ`=g!2ZVVIeDgUj6*F;}E2DT?V9LVkC+W-1UZ; zd^^=z=~G3oU=mCZ!8e#|#(Zt(rs_4`H(ern8Mfe8u}!zOYPETGEey|ZJUt3Zlk~?w zUX<F<tbN~6Q4xJX)lMcNeXhD{RLY@6HCrHrVf(tvk1u3POpOK8R^{wT2!3(fjx#pm za-SFFaM=mf(Msnh#a)CYVNR!%Ziwg{-mkY7@GH7@kbK8~oMs}X?LT;$IJ(-(5SR9< zE6s6U<?K^KR*{_xJEjt32~#DlaO@%uu#`32vm^M}3DLY$;)b#io4Yp>ILc5(ZqNNr zlr~#>;sd)wOZt`;H~4D*PcQ4e%3e>#I8%~hJdoJ@X86ayj3R=3z4B$<s(eAmB{cWG zZLx}F4O7V~nx!kOdfuuL^HWz|h_||sGFPO!y4yqm4xDe!-b^27h4!M)#wg5CXbT=q zh>}37$miq@c;<&F(t@oDV$UAbi)*;a>}|m@I#S&cTAV`#W5zEX)%@x4?yP<HO|XoT zUE|k|Yw>)ZLFrAA<wJ&of&tQoUcWZ7q*RQtSRHoz{FR>h@?L*L-O38R-{WB2JP|;V zkV-f&nbFhh3_TV}D5p14JfWtBtIz1;!TGXQgpm!Wy>%{DnIem5xTf!7QSGUVB{xcw z*Eo}n7zYgmrvqmLuH*DIg@$pGA?M_|UMV2d1~rc@o_DN=Xc3{s+v7%%a&=8?b<V5F z;4fgqRx*9KGioZS!{=4I_Xp>*=jY6;`MmXR&h~1FZvT%r&Cpp2&0S_Ah^q3dI2=Bp z=kwDP_c9<8$|*FEC;Fb1jNnQIGZBU3il@2YZ_U%1N#3CMMW%8deu9#tY1X0Jt;sBy zd`4O(YwrulQfN+-dHK*?z!he~-mSQ7DU~=Z6jYr!1$P-?{aR0lLc*vIPw+|hVQWZf zRI6%x&)m3pO3E>JX9Vf-#GEq?T~7y+v@|F$;7j~wob3=i=9=AczK{$_@O%H8?~lfZ zeLw+@qu=>$dy3XiKW&O<tgv1~vJ}x6MT$wkk|V;p-h}5G_sMlxR+0b)g|h4J)`K=$ z#3`jH8P8=ag~~RqhY$Lc-xlsrrDR0wU%U%{c|F%u@h-A}7`iYw{k2n)03m=za2tIs z3w4hmaXkv$SjZ1gYu)xrauL&hfKO_dYIONisLK?gXlZJ;NYH?sTdf&3I+lls7|uR- zf6k<+=0TBtBdo)zvhw=$bh%qa7qc)GY@n>9FQOv>ER&$6=o%{dPFYaqSwg)Q!~299 zf@)Z=!5|1zcp+}K<!hZWFDEsai9%g8ydM&R$PK87*G>af_*FJ_6LuS_^cGl$GTX^E ztQa$1UX2Z7CHQLUubDH$I5zz}&SK#;R~D~3YhG=`S>yUhYcEeVJ+XT;-l$8*f3QH2 zw#C`s9Y}YBmVq-?T?65=vfYz{0ah+@5N=R8fEKJ?(;{N}Jxy?)=1QHlvWHHpCaFzD z$P}H`85SI*;bT@A!n%_Ia)^I(p`ZXt$x;#zrA3zIwe^gFQ(tFW`$gGQKWAAtUQ*M_ z`mcQ`_bd=ZNi@=F8+;QU0w;IYjsj(*zRrI!z87UIITSS6ZcN1k=?rThzxIS4KjAXc zDf88-O2`mbepW2Qxc+&d`;@1|>o<|J(J`0OZ*=axAkov0XY|g;2pdnOdL<>37YQ7G z4{C^!bj)ScY$N=AIlPl_NcubPQ&qlmFt1l!F{>Wt$dB#W@q}^Td;BXLI<K|9-p#^f zQQvp>w5IGix9;ucl0TgN5oDNqM|L;ZA;$Qao{#sf?PXyfcQ_YQ++AvF4hDSt79y?2 zuz6JB8B*iSV_hzpP*lgg4W?Z#6{mV#l#{$79S7=H(^^j<Mt%={WrnM;nZ(|D+p=xj z%n7lP+fW@X_h~G20UXR;r;>y;a9^7n1vKj&ThvZymTC*Gu#;6|<`NW(rcy%*{&iwX zXeY^NJdl4Ncc%DbD*q36RzMe~cD3}`;t9=UuzPOCRTmdBe=eEPq?@h+cj!9OMdiER z^&!Vq0_RGR5i$v@H$_69NVW2nbl!~W0QNpfPN#*l<w?FJ4dbcCTFNx<%16B?iqWG3 zM>`Sek+qXRs*fhENiR(D$72-z@$oiw7Bs91cYj(1vaoJ$@^p%Z+~YR>5X+uaIy;-e zqO_O4#A<~;YLi2_K#3aXdtZ26q)Mtu$NkmcH(1~Oll*5Ft`GjuLSDNaE(wGlE+kyV z2P(th;QVB-`D!ZHQbNR87Nuw=Fw9Qe#hOB{&1*hhqUSaxnM1VKH=YRJDUc#{WSP^3 zR~q;P^xE>Wog`x~J6{;d!Xg~Dvymtc6}k&p`Aco}n^iWC&+uq{lktI^KCVxO9Pa-i zj}0SkmI}^9y!`NHoe5pk<qWz&LIDmUeGjx01bo-SS1b5TT|~NJ1o<lxOvAKMV|;I( z9$f0*W*kUr8@9u*+5ey1D3c|xdyYVr@;(9Y+T#%S8THE`gl&a9pDn?(r&&-DF^q#p zmm<k`6w-L;Sx5XWDvvWdb96~Nqr#&Qb?Z@OnEE!6>;!{+q7?;xSj|IFwyJLJucpK@ zZ2>{S6@i_;uHe>}8BFXbZ05!jbN5Rd?YuL%Rqrt8m1UtW#_`L1uCQU@m+xPsk9%>m z2<?UGs-%I9g`6aom@P7x5;Z>6v{qbuZwNH%IsUa=&hN+kEqYE-&Ui+~RA;5^xkJ4a z9jMegz)~#rDY4Ji#+oXU<XqN<0#9N{eO3mKNs&FR3%s$Chv^22izA4la^>Cyf(444 z)PZ>6>fkA2n`S-NY31#ZneW6c6)FEfaZlCM=&TQ}W4aormKEJI#`FhVhUD+A`sHbL zcd$0|-lOey^<6CM(!{G!6&+bn!b-J;&w{9)o`6pH)#J93rMb?Xn-n4GZ1^Vrxs_?B z;r$nHu6AAAHd82_un9JZqaKUg7z&?`$|0FRxqlwEe6m()h~ksvC~+mr?LJ@*V0~VE z+%b#P)7xi?sa}Metr(54wc-RWj2|1T6kQ2UM*#v%aY8nN%k{!yynls~^Zdf*@^q6g zD9kU2D{*o*&2+|Hp>?}aDYbiABK;^Fx56eeEM6(&*0B|bA|ERv3Ej#6)0mM+?M?{` z{cL-o&Y_nCOOHMog+x5r82jQzQmJLeArsDC8fB&<LQG*hXZ=6+3`s?Y3xxbJq5i?a z(Xi7EtERKmu}G*5UBINi=+|#mBSg-Q@5mJv*E7?;+*#&#+o0FYW!dkO;?PQiG5`|Q zv~I|B|M&;*-iIdNhKb1PvF6<F4^5U3Q!cwX!49DG_mOko&2oW)@T8AI7kNrL#ao$U z_e*R4cvn8nNy?Pg4xs1Ck+|tq&VB3-q+<hx@ciewJ|oDz%0fzP9b>vS;Lu}wd~9G3 zHCc*~>L$90T;y=`KlA;eS)h#rWo{KJRZKxfiDTuZ7BS*`<$W%5v(YGz3y0Hj`Um#w zi8-AS{*f^ML4#I#4o*O%eEvi9_d@=w9)O=ZUv}LD5&s0h+^7WUPQ~qT4!NIz48x37 z95{DkX{W_yDX5bzO~D)fP1I4V>+wXl>kk>Gb+mx3>LuUjRu0_nK43-k(KsS(eKJ!V z>OB74hN>KznB$P!FiRAVdv7Q=NMbaKidMAB;>&+NnOc_-uoKTNnlI6dVdP!^l7RHm zs?Ya&?3LS0($^P%o}O^FLJ(zk(aToByAFFTZ_W>T13=|d@zZ+jL@5>75ocZPpy_Ne z@6eUhynT39*J}<|IIf<PvZITv^woeTWFL6ZSx1WbEzY9_1*f%bh*2OrQB_Nm+!(to z#|y_lir&WOTi6Oh8TnMnQk{>Z`RlH6m@taq$}kpG>Czw3$EQ>byi*6OV%48FO`)=3 z%JbSYK#0nh=U5M^gNj636iZxm*(44nPi(;!h!j(UA0ohdCqr`=WCX<99|-_tTS?{Q z<r#_e)RpS|cRN|Pf5PNv_bpG^#~o3lpsJRye?$*Sr2!dtf4k<>1t8<*yiC}fibc)} zp-zruypYnznM-af*sp4l$#{$hwPTaQHs(FnhD(&p=%vp#yhl@aM6L}xgt-#Y+m+A4 zsVLR?fESsT9zNY3M=xMMG}!2_p5NJ(x9kCh=9kt2dmNEUUg3eN_3mU@hajgl-Xmbg zHYD?XIVA=)SjYc)R|$Aww2-QTyF|~CV5aL3mk45(&Ej(JA#!&8jB@Wi1az48^7gXc z@41UqEfio|e$Op>3Se7GH2d}>O#aCCw=Nk-QhXjU?}Z;U2#D5LyxU^vn@v`2!-fH? z=o1CxVmGon!%(UZEMX&3uA%@8OdYKWTAzg6G|L?Jx}n<JOrm&(={$|nRnLfluMOiD zDH~=SdSkT+MNu-rT-w2YV<OgHSXy^;m(FT7Jj!>^!mL^dpNA-y+>ofb>{An#W3Yq3 zzV^6fyK8D^F($$(tlR)TJxm^QWn`u|Ar7Xx+Z>^s9vpoZJQr+>ap4LFfBY1}%ckQ) zY#;2s&y|@r-q&6c*dH~*ds`jib_S0A_)bvwkhZjOVt-$y5`iUlJ_@!|ywbvWLDU=o z#?}WkXaN9>^wn;@diGRn0&hHkzI>GI=i5HFyllTc#J{eazW(F8E@H<5db?~UH+--y zxh#0^@Y2(}E~iMh5_e?V*(wk`I~7Jl(atU}#GD2t`#o{m)apEd(1MuMGASNnjAI2- z|A?ql$E(gTy*3=9&K`EXgK9z+f!$V=9O1hazU5NG)biEQbzo!}vVe(W8Fshd?vPrD zS_!r_+WUwb30U=V^h^;785a0CKWHcaHU}pEIs?h<En|P!ZFk`mR9OCG_=%-os}&xb zOpn{g8-0U*f2SstGLj6NnEMKpGdsKZ@#Lt41TzGF?Im29+wkidBXyCxTyq=<hpo;h z%l_vq_xzRx=@W$#J>z}zKtcL#&&F;0UdL)f%8=3djJ-2G-o0oLV`1-vOtqqKrkLxf z<a7}wW5K7xPX|3WhD-2Jg<ZINcYjont1lxj+T{<!c!LgCX-fYalRaXzR+#*k3}k1) z>YOa0{?FtDoIb$I#exGu2e9)W(nm)a6XJP|)d5%~!4=ml?tU*I5_*f|z_%=4xj~?R z0KGyzL#WFGwNid1^2x@>RNk9ZNW<67it?bPG#l87;>ks_SBbVkV6R24Iml55>}rK- zB8dL-$W+ANIo{=<M1&AkhRrTSrGWY^zTQ7!I|KW8XP^dTyYaqzRtj8q&xS`i;7mGn zOGb?L113-R_KHvB_Lwmc=T$++yu6Ypht6Jf1bD+MLu>)O{kJTUGp(DY#u|GgAHGQ( zOGl4+hGl|x*BA*X$b6Khn_<uh?ic+_hl3bVF^XXUz;pl0hIUr>mHc#^(!~PIByIa$ zO6u#vFyjO4rkwc=KUt=I)T<ji6@aXbIHglQ!!q|FQMVg1-hOIJ5!GkrCAQ{jX-ONm z_V?MBz?WkjCko3k$>qSbV8FDNTB@Kr9lxg)yE!clNfoiT43tEcTaJ+cjeTtJ<@)zR z%A*TQOKob{;dEG3@P*H9<TaC#L3!6qQhTtH!iwd6B)emywu02(OTGs$J0sn6RX)I+ z$ULZ112V@USWXX^J1)LA+&*orllsay%@T6TNT+6kQSzSVcbxQShJ6^=?<U9MKJMD} z_U@6{6HH|-_v<67jkA-F@w8(Efc%Jo!pfQaL7sPx+S7e88!ob=_A|j<YPvzLQzXVd z=(#~p<R1HJNrYmi*4-oWv}VQ+my)~f_Jt(ue)3VtSAV|zbuk6^i4qd;1vz+2u6hcx zn89P}>wY$T1WXC&t}F#MaZDZlfQkQc0vye<R*_z!d*{c_m%VfMvQByvE};2wY{Af_ zEZ2F`OFz|Alwx8UiJZNtN^Lepc&iWPcF&9(S|NkRl7}}EhL@N8!G|Xm#B{Nt{E`9( zHlx6*KXcKjaw_X^Rk`H&(vET)xd$3pR2e8Pd(P_RNx0(6;rl6CMU;@F&iEX-PB3R7 zBp2U%LMlV=CyXqi_~li5`q{yI2JXk?i7@%LH7aSi$fqRJbFq<PZd8@|7MR_atB_Si z7sJlh!Dtz<6al)_RHB@C^d-~JTNSZGaV+p4Y0^)^F0L-49uyb9It6~QQmyW;Z@W;5 zq&l(9X(l7!%md6vIzJ3gQ`#$|^)qfWlf0Qp-P4r8ke??tBJwg4EV-S`9QeGgu34F3 z_PTwskVns<{dxr&3&z7#QKD+6Xaf_Ag)LS`AD22ofKIC6z|Pn)JtdlRw#6@V?sD>I zf$hLUkCI2(KwyTa#11%mHPMg$^rJBC7t1PCY`==_%B=mU=v_u9yLuGjb5BU+>n*|D zBG*}Suk_I*<I|{7wLhb-U~Rs#tdBk~rsl>I&+)H7=xLYJoP=A<1*<Yk0XIx_LwfLw z05hI%IO2~3ydS+En9W4g;Z(Ah`uFx)8>_=rr%?zC$Y1R4N+-oiiH$x>xJ2ei4ZgPC zXeJ}G>Gjc(Wtq8PyF4CJvND96o;E1D_)6{PYgVbk%x!(NZ(1OHaAfc#IASU*fkgjf zZm$A<%C|FquF5W{3b;Ofn|1SoF0%(!y4|INwuvw~*RU}R4{DAy$Ghg_qi+u!#yd5O z8l-f^2C9k1_O1%h;%{tu+LwdKBXf=^J%8+5To|9L9{H5u(`pjKzGO1iot>d%;)z8k z^kJUjCl#B`h7~aox{+DZB{O)Y6EcBRGCOex(^ji$SNO<lUqrX-necl%jb)c+Nlc7x z(0Q#VitN>CVKFdg=B9omL5%W1GHO+&E?U2KGBeOF;=z;^Jb7B!Kc%*3faZW@+6=@@ zX(<1&<lNL({(%!Irg(La*PpZG#?-VO_4$mI`u>;dPco}VD44+rYw4P{O}bNQa_%#S zQKD(C{~|{X#JGAV@M-a>$NG8##fMVv+y~Ysxx~L48)Jqi*Ye}kvxJ|9_fV#RtJ^(s zi0JQohk13r)^7P|rpuZphS)>+FXF?E7Ex5wbm5!4t4EfG4f_4XYo=I3c}K6~rmrU* zxaE@Rl%`}-uBN*<n(SggG`ZfVY7l|%Xc-5&wA<{h3ki;a%v*{DoAfzaIj`yOB0Z>x z*1Mx80RHj0_OETaTCC}7#3(%Li@qENiTe0WL^I3BTmFL3@fbL|_EPU3N^8w=9~xR2 z^G~7eV4xZ3u*_UpjhWWrw)hEEe%8H~M^zpV=c;2zO-Y>cwLz-Y_5Qxh`6{o22d$BS zQ|cs7rCuy-yFK9iPOpA?qEXQky*4W+GVyIZdh}Pedg8r<=S6nCZI@Y4N@!?GKx@;# z%Hh_eaZ_WIQvF#Dc9WGYa9fZevqY3bHjCRkE=q~pCCJt5Tek4C3N5YLWA8?Ncj)hD z0RkF;-qC3H`{^hbU#1N$aI$T~Jp2=4kB1DkI+n8D(Rp@#XTvnb<Vl}u+iv+mn47vl zCRIzf_!DZyu|QiZp>*uzK+%P+UY0ejwU60dQPDk6U>tG{&^Ed$g?^N|DjWT`rhw-P zCN6C=h%k^Q;A)N=N~9iI8(O|7Bw-t2*WZG9r^)ZjT=M>-qW`_5NHH;1YyZ-hSgeHj z)LrW%5Tc2N<ce6J$~HN)4Q^iNNzxaikj$wprF}7uRJLo28P>k;3TTuuka4ka>@B&- z^ld-G_hC!vnGmBela=cWF!(sq)+oF|72uOz;o7%OO72q6BC<sGe#OH+@2uW`Hv;@D z<Z|3qi3cVH+vfZq0ur*0l~Ul7$d0)@y1}*VS&chd*~wa##C^{&J}*_#imSDs=XEM$ zyB_~_aMZJnV*IU}Ja81^?lw`@L@4Sh&^l(-5_62ArFQ&urpkdonqgT#d)JLJOnz3h zPdr-4r+VHxepqgIhs?=vq(OV7o5)isLYe<1XZF|EjC1B6IzR6@9^dQ}Gf*dtqaW<- zFTeYt6|;J&6jVR393SexQ#g2b&$e^R`IUYx)ap~~>pQ+(cX_ZfP%u$YQ>iHG(dtun zY#TgXsZ)6VIw3F+_Rz0I`Y}&Gkpw&LNxptRh~fM0Yfxesh!;s{)~(@pxpFd=%IK*F zVW2AqMsIE_-XYXgJj)qd+EF?I<<hPlURFy1veV-kM987;3LZzFGPd?PB&jK+wK2)8 zkYung%YEfcflEX&VcO_#zV~0JzFW+tc{Vjx;`cH&N?ORFi5?ykYGM-zZC!;H;fb0$ z?Xa0<oJc|Wt$<seQ$2l*TN97r{#ih?sV1Ha9RpVEN30$kZ!UaJY(56DlLn6-(j=bA zW;cIJQ|dIlq*ZiC)@t>8?aI6Jx;D!Y%*$IP)88vS<z5ZIvZmii3AQNl(Jx0c9WerB zsjw!W6K|&7R^1<S#;60S6m<ynO4d$Kod{7Op)RSDAun?FsAq`<I&SnR9sZg6`li1w z$t7a~^uwW$lJl}COyODs%;xDQ%9$=xpq(^j8nbKvb3o5($@KVNox}fWXJiBrj-)@F zv;W<i`|nOy;d-?Iq>tFg{qyU8AKbX6Cy?EEk$UFuCUXCrws|lPM1($V`=5tB2&D9x zXdBso_k;%C&iJ2!_A8wXf2r0l^B;#z+`nH>_ELxDznl91^TUWBK*g`EmiUjuzIqDS z68oUf=<oh*|D3jY&<Ft2L}$f~zbEm}Y=DD^Gl1uf_LiCcU;i_**?i!ngPwqt58B{A z4twU*$#Bz$X@QCV%Qt`b=b{5{2=Z6>&%^EpY&rO?DCyrW|EGo9R!BG9vK7+*>3*@b zO1D<&-<YxmyuYD#3wVFmqpe!Hxh_s_)zVGoutkr4v$`$D`x_y*81E)RZf#<I?=QAC zF`Lbt^tSe;zY%h4U%H8qTT;Vsg=9-=*peFlQLnZH!QVuBOA!36lWu9en+UljHEc-@ z|J*j%k{ULN^p@1H=>)-TTT;XSL#d%qWd4JIz;*$nzph$rf$(pxesW9i{r^qxUH6%` X@wg;?Bqme<_!t?O{)N7FKk~l;v>o}_ literal 0 HcmV?d00001 From 08c2a9814882d7e1ad900f0f42c05c137b388d20 Mon Sep 17 00:00:00 2001 From: Pelayo Felgueroso <pfelguerosogalguera@gmail.com> Date: Tue, 14 Oct 2025 14:30:45 +0200 Subject: [PATCH 22/22] Resolve comments --- .../components/avatar/code/AvatarCodePage.tsx | 4 ++-- .../avatar/overview/AvatarOverviewPage.tsx | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx index b0442f658..f02fd4e3b 100644 --- a/apps/website/screens/components/avatar/code/AvatarCodePage.tsx +++ b/apps/website/screens/components/avatar/code/AvatarCodePage.tsx @@ -37,7 +37,7 @@ const sections = [ </td> <td>Affects the visual style of the avatar. It can be used following semantic purposes or not.</td> <td> - <TableCode>'grey'</TableCode> + <TableCode>'neutral'</TableCode> </td> </tr> <tr> @@ -105,7 +105,7 @@ const sections = [ <tr> <td>size</td> <td> - <TableCode>'small' | 'medium' | 'large'</TableCode> + <TableCode>'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge'</TableCode> </td> <td>Size of the component.</td> <td> diff --git a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx index 145ba7583..c3c4b937a 100644 --- a/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx +++ b/apps/website/screens/components/avatar/overview/AvatarOverviewPage.tsx @@ -33,16 +33,16 @@ const sections = [ <Image src={anatomy} alt="Avatar anatomy" /> <DxcBulletedList type="number"> <DxcBulletedList.Item> - <strong>Base Shape:</strong> defines the visual form of the avatar. + <strong>Base shape:</strong> defines the visual form of the avatar. </DxcBulletedList.Item> <DxcBulletedList.Item> - <strong>Content Area:</strong> displays the main visual content. + <strong>Content area:</strong> displays the main visual content. </DxcBulletedList.Item> <DxcBulletedList.Item> - <strong>Status Indicator (optional):</strong> a small color light that communicates user presence or status. + <strong>Status indicator (Optional):</strong> a small color light that communicates user presence or status. </DxcBulletedList.Item> <DxcBulletedList.Item> - <strong>Label & Sublabel (optional):</strong> textual information placed next to or below the avatar, + <strong>Label & sublabel (Optional):</strong> textual information placed next to or below the avatar, providing context such as name, role, or email. </DxcBulletedList.Item> </DxcBulletedList> @@ -59,7 +59,7 @@ const sections = [ </DxcParagraph> <DxcParagraph> Through its different <strong>shapes, content types, sizes, and color options</strong>, it can seamlessly - represent users, temas, or entities across various contexts, from compact tables to rich profile sections. + represent users, teams, or entities across various contexts, from compact tables to rich profile sections. </DxcParagraph> <DxcParagraph> Each variant ensures visual consistency while providing the flexibility to match the tone and hierarchy of the @@ -144,42 +144,42 @@ const sections = [ <tbody> <tr> <td> - <strong>XS</strong> + <strong>xsmall</strong> </td> <td>24px</td> <td>Tables, dense lists.</td> </tr> <tr> <td> - <strong>S</strong> + <strong>small</strong> </td> <td>32px</td> <td>Headers, compact cards.</td> </tr> <tr> <td> - <strong>M</strong> + <strong>medium</strong> </td> <td>40px</td> <td>Sidenav bars, user previews, chat threads.</td> </tr> <tr> <td> - <strong>L</strong> + <strong>large</strong> </td> <td>56px</td> - <td>Medium cards, profile sections..</td> + <td>Medium cards, profile sections...</td> </tr> <tr> <td> - <strong>XL</strong> + <strong>xlarge</strong> </td> <td>72px</td> <td>Modals, profile headers, featured content.</td> </tr> <tr> <td> - <strong>2XL</strong> + <strong>xxlarge</strong> </td> <td>80px</td> <td>Large cards or highlight sections.</td>