rustmotion-components 0.6.1

Component library for rustmotion (51 components)
use skia_safe::{Canvas, Font, FontStyle, Rect};

use super::Codeblock;
use rustmotion_core::engine::renderer::{
    draw_text_with_fallback, emoji_typeface, measure_text_with_fallback, paint_from_hex,
    typeface_with_fallback,
};

pub(super) fn draw_chrome(
    canvas: &Canvas,
    layer: &Codeblock,
    x: f32,
    y: f32,
    width: f32,
    corner_radius: f32,
) {
    let chrome = layer.chrome.as_ref().unwrap();
    let chrome_height = 36.0;

    let bar_color = chrome.color.as_deref().unwrap_or("#343d46");
    let bar_paint = paint_from_hex(bar_color);
    let bar_rect = Rect::from_xywh(x, y, width, chrome_height);
    let radii = [
        skia_safe::Point::new(corner_radius, corner_radius),
        skia_safe::Point::new(corner_radius, corner_radius),
        skia_safe::Point::new(0.0, 0.0),
        skia_safe::Point::new(0.0, 0.0),
    ];
    let rrect = skia_safe::RRect::new_rect_radii(bar_rect, &radii);
    canvas.draw_rrect(rrect, &bar_paint);

    let dot_y = y + chrome_height / 2.0;
    let dot_radius = 6.0;
    let dot_start_x = x + 16.0;
    let dot_spacing = 20.0;
    let dot_colors = ["#FF5F56", "#FFBD2E", "#27C93F"];
    for (i, color) in dot_colors.iter().enumerate() {
        let dot_x = dot_start_x + i as f32 * dot_spacing;
        canvas.draw_circle((dot_x, dot_y), dot_radius, &paint_from_hex(color));
    }

    if let Some(ref title) = chrome.title {
        let Ok(typeface) = typeface_with_fallback("Inter", FontStyle::normal()) else {
            return;
        };
        let title_font = Font::from_typeface(typeface, 13.0);
        let emoji_font = emoji_typeface().map(|tf| Font::from_typeface(tf, 13.0));
        let title_width = measure_text_with_fallback(title, &title_font, &emoji_font, 0.0);
        let title_x = x + width / 2.0 - title_width / 2.0;
        let title_y = dot_y + 4.0;
        let mut title_paint = paint_from_hex("#999999");
        title_paint.set_anti_alias(true);
        draw_text_with_fallback(
            canvas,
            title,
            &title_font,
            &emoji_font,
            0.0,
            title_x,
            title_y,
            &title_paint,
        );
    }
}