use crate::tokens;
use egui::{Align, Layout, Response, RichText, TextStyle, Ui};
pub fn section_title(ui: &mut Ui, text: impl Into<String>) -> Response {
ui.label(
RichText::new(text.into())
.font(ui.style().text_styles[&TextStyle::Heading].clone())
.color(ui.visuals().widgets.noninteractive.fg_stroke.color),
)
}
pub fn muted_label(ui: &mut Ui, text: impl Into<String>) -> Response {
ui.label(
RichText::new(text.into())
.font(ui.style().text_styles[&TextStyle::Small].clone())
.color(tokens::shadcn::TEXT3),
)
}
pub fn space_group(ui: &mut Ui) {
ui.add_space(tokens::GROUP_GAP - ui.spacing().item_spacing.y);
}
pub fn primary_button(ui: &mut Ui, text: impl Into<String>) -> Response {
ui.add(
egui::Button::new(RichText::new(text.into()).strong())
.fill(ui.visuals().widgets.active.bg_fill)
.stroke(ui.visuals().widgets.active.bg_stroke),
)
}
pub fn num_cell<R>(ui: &mut Ui, add: impl FnOnce(&mut Ui) -> R) -> R {
ui.with_layout(Layout::right_to_left(Align::Center), add)
.inner
}
pub fn grid_col_width(ui: &Ui, salt: &str, n_cols: usize) -> f32 {
let id = egui::Id::new(("grid_fill", salt));
let avail = ui.available_width();
let stored = ui.ctx().data(|d| d.get_temp::<f32>(id)).unwrap_or(0.0);
let target = if stored > 0.0 {
stored.min(avail)
} else {
avail
};
ui.ctx().data_mut(|d| d.insert_temp(id, target.max(1.0)));
let gaps = ui.spacing().item_spacing.x * (n_cols as f32 - 1.0);
((target - gaps) / n_cols as f32).max(24.0)
}