Add Avatar docs

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
This commit is contained in:
Charles de Dreuille
2025-04-14 17:18:59 +02:00
parent 851779d101
commit 378fa2908d
4 changed files with 111 additions and 0 deletions
@@ -0,0 +1,75 @@
import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import { AvatarSnippet } from '@/snippets/stories-snippets';
import { avatarPropDefs } from './props';
# Avatar
An avatar component with a fallback for initials.
<Snippet
align="center"
py={4}
preview={<AvatarSnippet story="Default" />}
code={`<Avatar src="https://avatars.githubusercontent.com/u/1540635?v=4" name="Charles de Dreuille" />`}
/>
<Tabs.Root>
<Tabs.List>
<Tabs.Tab>Usage</Tabs.Tab>
<Tabs.Tab>Theming</Tabs.Tab>
</Tabs.List>
<Tabs.Panel>
<CodeBlock
code={`import { Avatar } from '@backstage/canon';
<Avatar src="https://avatars.githubusercontent.com/u/1540635?v=4" name="Charles de Dreuille" />`}
/>
</Tabs.Panel>
<Tabs.Panel>
We recommend starting with our [global tokens](/theme/theming) to customize the library and align it with
your brand. For additional flexibility, you can use the provided class names for each element listed below.
- `canon-AvatarRoot`
- `canon-AvatarRoot[data-size='small']`
- `canon-AvatarRoot[data-size='medium']`
- `canon-AvatarRoot[data-size='large']`
- `canon-AvatarImage`
- `canon-AvatarFallback`
</Tabs.Panel>
</Tabs.Root>
## API reference
<PropsTable data={avatarPropDefs} />
## Examples
### Sizes
Avatar sizes can be set using the `size` prop.
<Snippet
align="center"
py={4}
open
preview={<AvatarSnippet story="Sizes" />}
code={`<Flex gap="4" direction="column">
<Avatar src="https://avatars.githubusercontent.com/u/1540635?v=4" name="Charles de Dreuille" size="small" />
<Avatar src="https://avatars.githubusercontent.com/u/1540635?v=4" name="Charles de Dreuille" size="medium" />
<Avatar src="https://avatars.githubusercontent.com/u/1540635?v=4" name="Charles de Dreuille" size="large" />
</Flex>`}
/>
### Fallback
If the image is not available, the avatar will show the initials of the name.
<Snippet
align="center"
py={4}
open
preview={<AvatarSnippet story="Fallback" />}
code={`<Avatar src="https://avatars.githubusercontent.com/u/15406AAAAAAAAA" name="Charles de Dreuille" />`}
/>
@@ -0,0 +1,19 @@
import { classNamePropDefs, stylePropDefs } from '@/utils/propDefs';
import type { PropDef } from '@/utils/propDefs';
export const avatarPropDefs: Record<string, PropDef> = {
src: {
type: 'string',
},
name: {
type: 'string',
},
size: {
type: 'enum',
values: ['small', 'medium', 'large'],
default: 'medium',
responsive: true,
},
...classNamePropDefs,
...stylePropDefs,
};
@@ -15,6 +15,7 @@ import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.s
import * as SelectStories from '../../../packages/canon/src/components/Select/Select.stories';
import * as MenuStories from '../../../packages/canon/src/components/Menu/Menu.stories';
import * as LinkStories from '../../../packages/canon/src/components/Link/Link.stories';
import * as AvatarStories from '../../../packages/canon/src/components/Avatar/Avatar.stories';
export const BoxSnippet = ({ story }: { story: keyof typeof BoxStories }) => {
const stories = composeStories(BoxStories);
@@ -141,3 +142,14 @@ export const LinkSnippet = ({ story }: { story: keyof typeof LinkStories }) => {
return StoryComponent ? <StoryComponent /> : null;
};
export const AvatarSnippet = ({
story,
}: {
story: keyof typeof AvatarStories;
}) => {
const stories = composeStories(AvatarStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
+5
View File
@@ -66,6 +66,11 @@ export const layoutComponents: Page[] = [
];
export const components: Page[] = [
{
title: 'Avatar',
slug: 'avatar',
status: 'alpha',
},
{
title: 'Button',
slug: 'button',