AkurAI Build
Menu

cosmic-mobile

public

Latest change 975a13e7afc3dea7e34c04e77e3879cf635a1bf7 - Upgrade system app components to iOS design language by AkurAI Build

//! iOS 26 style upgrades applied to the existing system controls.
use eframe::egui::*;
pub const BLUE: Color32 = Color32::from_rgb(10, 132, 255);
pub const GREEN: Color32 = Color32::from_rgb(48, 209, 88);
pub const RED: Color32 = Color32::from_rgb(255, 69, 58);
pub const ORANGE: Color32 = Color32::from_rgb(255, 159, 10);
pub const BACKGROUND: Color32 = Color32::from_rgb(0, 0, 0);
pub const CARD: Color32 = Color32::from_rgb(28, 28, 30);
pub const FIELD: Color32 = Color32::from_rgb(44, 44, 46);
pub const KEY: Color32 = Color32::from_rgb(51, 51, 51);
pub const KEY_LIGHT: Color32 = Color32::from_rgb(165, 165, 165);
pub const SECONDARY: Color32 = Color32::from_rgb(142, 142, 147);
pub fn back(ui: &mut Ui, label: &str) -> bool {
    ui.add(
        Button::new(RichText::new(format!("‹ {label}")).size(17.).color(BLUE))
            .frame(false)
            .min_size(vec2(88., 44.)),
    )
    .clicked()
}
pub fn large_title(ui: &mut Ui, text: &str) {
    ui.add_space(4.);
    ui.label(RichText::new(text).size(34.).strong());
    ui.add_space(12.);
}
pub fn caption(ui: &mut Ui, text: &str) {
    ui.label(
        RichText::new(text.to_uppercase())
            .size(13.)
            .color(SECONDARY),
    );
    ui.add_space(6.);
}
pub fn card(ui: &mut Ui, add: impl FnOnce(&mut Ui)) {
    Frame::new()
        .fill(CARD)
        .corner_radius(16)
        .inner_margin(Margin::symmetric(16, 4))
        .show(ui, |ui| {
            ui.set_width(ui.available_width());
            add(ui);
        });
    ui.add_space(16.);
}
pub fn row(ui: &mut Ui, title: &str, detail: &str) {
    ui.allocate_ui_with_layout(
        vec2(ui.available_width(), 44.),
        Layout::left_to_right(Align::Center),
        |ui| {
            ui.label(RichText::new(title).size(17.));
            ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
                ui.label(RichText::new(detail).size(17.).color(SECONDARY));
            });
        },
    );
}
pub fn field(ui: &mut Ui, text: &mut String, hint: &str) -> Response {
    Frame::new()
        .fill(FIELD)
        .corner_radius(12)
        .inner_margin(Margin::symmetric(14, 0))
        .show(ui, |ui| {
            ui.add_sized(
                [ui.available_width(), 48.],
                TextEdit::singleline(text)
                    .hint_text(hint)
                    .font(FontId::proportional(17.))
                    .frame(false),
            )
        })
        .inner
}
pub fn primary(ui: &mut Ui, label: &str, fill: Color32) -> bool {
    ui.add_space(8.);
    let clicked = ui
        .add_sized(
            [ui.available_width(), 50.],
            Button::new(RichText::new(label).size(17.).strong())
                .fill(fill)
                .corner_radius(14),
        )
        .clicked();
    ui.add_space(8.);
    clicked
}
pub fn key(ui: &mut Ui, label: &str, size: f32, fill: Color32, text: Color32) -> Response {
    let (rect, response) = ui.allocate_exact_size(vec2(size, size), Sense::click());
    response.widget_info(|| WidgetInfo::labeled(WidgetType::Button, true, label));
    let fill = if response.is_pointer_button_down_on() {
        fill.gamma_multiply(1.4)
    } else {
        fill
    };
    ui.painter().circle_filled(rect.center(), size / 2., fill);
    ui.painter().text(
        rect.center(),
        Align2::CENTER_CENTER,
        label,
        FontId::proportional(size * 0.42),
        text,
    );
    response
}