Skip to main content

teksilo_core/styles/
radio_style.rs

1// SPDX-License-Identifier: MPL-2.0
2// SPDX-FileCopyrightText: 2026 FernTech
3
4//! Tier-3 style protocol for `RadioButton`. See `docs/styling-system.md`.
5
6use std::rc::Rc;
7
8use serde::{Deserialize, Serialize};
9
10use crate::build_context::BuildContext;
11use crate::signal::Signal;
12use crate::widget_id::WidgetId;
13
14#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)]
15pub enum RadioVariant {
16    /// IntUI default: filled inner dot inside a ring.
17    #[default]
18    Circle,
19    /// Square with an inner check glyph (rare; some accessibility kits
20    /// prefer it for distinguishability from the round Toggle).
21    Square,
22    /// Rounded square — softer than Square but distinct from Circle.
23    Rounded,
24}
25
26#[derive(Clone, Debug)]
27pub struct RadioStyleConfig {
28    pub is_selected: Signal<bool>,
29    pub is_hovered: Signal<bool>,
30    pub is_pressed: Signal<bool>,
31    pub is_focused: Signal<bool>,
32    pub is_disabled: Signal<bool>,
33    pub variant: RadioVariant,
34}
35
36pub trait RadioStyle: 'static {
37    fn make_body(&self, cfg: &RadioStyleConfig, ctx: &mut BuildContext) -> WidgetId;
38}
39
40pub type SharedRadioStyle = Rc<dyn RadioStyle>;