import { StyleSheet } from 'react-native';
import { tv } from '../../helpers/external/utils/cn';
import { combineStyles } from '../../helpers/internal/utils';
/**
* Avatar root styles
*/
const root = tv({
base: 'avatar__root',
variants: {
variant: {
default: 'avatar__root--variant-default',
soft: '',
},
size: {
sm: 'avatar__root--size-sm',
md: 'avatar__root--size-md',
lg: 'avatar__root--size-lg',
},
color: {
accent: '',
default: '',
success: '',
warning: '',
danger: '',
},
},
compoundVariants: [
// Soft variant colors
{
variant: 'soft',
color: 'accent',
className: 'avatar__root--variant-soft--color-accent',
},
{
variant: 'soft',
color: 'default',
className: 'avatar__root--variant-soft--color-default',
},
{
variant: 'soft',
color: 'success',
className: 'avatar__root--variant-soft--color-success',
},
{
variant: 'soft',
color: 'warning',
className: 'avatar__root--variant-soft--color-warning',
},
{
variant: 'soft',
color: 'danger',
className: 'avatar__root--variant-soft--color-danger',
},
],
defaultVariants: {
variant: 'default',
size: 'md',
color: 'accent',
},
});
/**
* Avatar background style definition — generic absolute-fill container
* behind the avatar content (clipped by the root's `overflow: hidden`),
* hosting theme-specific layers (e.g. a glass blur layer).
*/
const background = tv({
base: 'avatar__background',
});
/**
* Avatar image styles
*
* @note ANIMATED PROPERTIES (cannot be set via className):
* The following property is animated and cannot be overridden using Tailwind classes:
* - `opacity` - Animated for image loading transitions (from 0 to 1 when image loads)
*
* To customize this property, use the `animation` prop on `Avatar.Image`:
* ```tsx
*
* ```
*
* To completely disable animated styles and apply your own via className or style prop,
* set `isAnimatedStyleActive={false}` on `Avatar.Image`.
*/
const image = tv({
base: 'avatar__image',
});
/**
* Avatar fallback styles with slots
*/
const fallback = tv({
slots: {
container: 'avatar__fallback-container',
text: 'avatar__fallback-text',
},
variants: {
size: {
sm: {
text: 'avatar__fallback-text--size-sm',
},
md: {
text: 'avatar__fallback-text--size-md',
},
lg: {
text: 'avatar__fallback-text--size-lg',
},
},
color: {
default: {
text: 'avatar__fallback-text--color-default',
},
accent: {
text: 'avatar__fallback-text--color-accent',
},
success: {
text: 'avatar__fallback-text--color-success',
},
warning: {
text: 'avatar__fallback-text--color-warning',
},
danger: {
text: 'avatar__fallback-text--color-danger',
},
},
},
defaultVariants: {
size: 'md',
color: 'default',
},
});
export const avatarClassNames = combineStyles({
root,
background,
image,
fallback,
});
export const avatarStyleSheet = StyleSheet.create({
borderCurve: {
borderCurve: 'continuous',
},
});
/**
* Export slot types for type-safe classNames props
*/
export type AvatarFallbackSlots = keyof ReturnType;