aura-gui 0.3.0

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Área segura en móvil: la parte de la pantalla que no tapan la barra de estado, la isla o el notch ni la
//! barra de gestos. El fondo se sigue pintando detrás; solo el contenido se mete dentro.

use crate::core::{Edges, Pixels, px};
use winit::dpi::PhysicalSize;
use winit::window::Window;

/// Tamaño físico de la superficie. En iOS winit llama `inner_size` al área segura: la pantalla es `outer_size`.
pub fn surface_size(window: &Window) -> PhysicalSize<u32> {
    if cfg!(target_os = "ios") { window.outer_size() } else { window.inner_size() }
}

/// Márgenes del área segura en px lógicos; cero en escritorio.
pub fn insets(window: &Window) -> Edges {
    let scale = window.scale_factor() as f32;
    let _logical = |value: i64| px((value as f32 / scale).max(0.0));
    #[cfg(target_os = "ios")]
    if let (Ok(inner), Ok(outer)) = (window.inner_position(), window.outer_position()) {
        let (safe, screen) = (window.inner_size(), window.outer_size());
        let (left, top) = (i64::from(inner.x - outer.x), i64::from(inner.y - outer.y));
        return Edges {
            top: _logical(top),
            left: _logical(left),
            right: _logical(i64::from(screen.width) - i64::from(safe.width) - left),
            bottom: _logical(i64::from(screen.height) - i64::from(safe.height) - top),
        };
    }
    #[cfg(target_os = "android")]
    {
        use winit::platform::android::WindowExtAndroid;
        let content = window.content_rect();
        let size = window.inner_size();
        // Hasta que Android informa el área de contenido, el rectángulo llega vacío.
        if content.right > content.left && content.bottom > content.top {
            return Edges {
                top: _logical(content.top.into()),
                left: _logical(content.left.into()),
                right: _logical(i64::from(size.width) - i64::from(content.right)),
                bottom: _logical(i64::from(size.height) - i64::from(content.bottom)),
            };
        }
    }
    Edges::all(Pixels::ZERO)
}