import { Avatar, type AvatarProps, type Theme } from '@mui/material'
export interface SeriesProps {
/** Used for the avatar's first-letter glyph and as accessible label. */
name: string
/** Avatar background colour (any MUI palette path or CSS colour). */
color?: string
/** Diameter in px. Default `24`. */
size?: number
AvatarProps?: AvatarProps
}
/**
* Series indicator — circular avatar showing the first letter of `name`.
* Background colour is `color` (consumer-supplied) or a neutral disabled
* colour, with text colour computed for contrast against it.
*/
export function Series({
name,
color,
size = 24,
AvatarProps: avatarProps,
}: SeriesProps) {
const letter = name.charAt(0).toUpperCase()
return (
theme.palette.getContrastText(toCssColor(theme, color))
: 'text.primary',
}}
{...avatarProps}
>
{letter}
)
}
/**
* Resolve a palette path (e.g. `"primary.main"`) to a hex/rgb string so that
* `getContrastText` — which doesn't accept dotted paths — produces a sensible
* text colour. Non-palette strings (raw `#hex`, `rgb(...)`) pass through.
*/
function toCssColor(theme: Theme, value: string): string {
if (!value.includes('.')) return value
const parts = value.split('.')
let cur: unknown = theme.palette
for (const p of parts) {
if (
cur &&
typeof cur === 'object' &&
p in (cur as Record)
) {
cur = (cur as Record)[p]
} else {
return value
}
}
return typeof cur === 'string' ? cur : value
}