windjammer-ui 0.3.6

Cross-platform UI framework for Windjammer (Web, Desktop, Mobile)
Documentation
// Avatar - User profile image component

pub struct Avatar {
    src: string,
    alt: string,
    size: AvatarSize,
    shape: AvatarShape,
    fallback: string,
    class: string,
}

pub enum AvatarSize {
    Small,
    Medium,
    Large,
    XLarge,
}

pub enum AvatarShape {
    Circle,
    Square,
    Rounded,
}

impl Avatar {
    pub fn new(src: string) -> Avatar {
        Avatar {
            src,
            alt: "Avatar".to_string(),
            size: AvatarSize::Medium,
            shape: AvatarShape::Circle,
            fallback: String::new(),
            class: String::new(),
        }
    }
    
    pub fn alt(alt: string) -> Avatar {
        self.alt = alt
        self
    }
    
    pub fn size(size: AvatarSize) -> Avatar {
        self.size = size
        self
    }
    
    pub fn shape(shape: AvatarShape) -> Avatar {
        self.shape = shape
        self
    }
    
    pub fn fallback(fallback: string) -> Avatar {
        self.fallback = fallback
        self
    }
    
    pub fn class(class: string) -> Avatar {
        self.class = class
        self
    }
    
    pub fn render() -> string {
        let size_px = match self.size {
            AvatarSize::Small => "32px",
            AvatarSize::Medium => "48px",
            AvatarSize::Large => "64px",
            AvatarSize::XLarge => "96px",
        }
        
        let border_radius = match self.shape {
            AvatarShape::Circle => "50%",
            AvatarShape::Square => "0",
            AvatarShape::Rounded => "8px",
        }
        
        let mut html = String::new()
        
        if self.src.is_empty() && !self.fallback.is_empty() {
            // Render fallback (initials or icon)
            html.push_str("<div class=\"wj-avatar wj-avatar-fallback ")
            html.push_str(self.class.as_str())
            html.push_str("\" style=\"width: ")
            html.push_str(size_px)
            html.push_str("; height: ")
            html.push_str(size_px)
            html.push_str("; border-radius: ")
            html.push_str(border_radius)
            html.push_str("; background-color: #3b82f6; color: white; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: ")
            
            let font_size = match self.size {
                AvatarSize::Small => "12px",
                AvatarSize::Medium => "16px",
                AvatarSize::Large => "20px",
                AvatarSize::XLarge => "28px",
            }
            html.push_str(font_size)
            html.push_str(";\">")
            html.push_str(self.fallback.as_str())
            html.push_str("</div>")
        } else {
            // Render image
            html.push_str("<img class=\"wj-avatar ")
            html.push_str(self.class.as_str())
            html.push_str("\" src=\"")
            html.push_str(self.src.as_str())
            html.push_str("\" alt=\"")
            html.push_str(self.alt.as_str())
            html.push_str("\" style=\"width: ")
            html.push_str(size_px)
            html.push_str("; height: ")
            html.push_str(size_px)
            html.push_str("; border-radius: ")
            html.push_str(border_radius)
            html.push_str("; object-fit: cover;\">")
        }
        
        html
    }
}