use std::rc::Rc;
use serde::{Deserialize, Serialize};
use teksilo_tokens::{InputTokens, TargetRole};
use crate::build_context::BuildContext;
use crate::color_prop::ColorProp;
use crate::signal::Signal;
use crate::styles::density::{dp, spacing};
use crate::widget_id::WidgetId;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)]
pub enum TabBarOrientation {
#[default]
Horizontal,
Vertical,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)]
pub enum TabIndicatorPosition {
#[default]
OuterEdge,
InnerEdge,
}
#[derive(Clone, Debug)]
pub struct TabStyleConfig {
pub label: WidgetId,
pub leading: Option<WidgetId>,
pub trailing: Option<WidgetId>,
pub is_active: Signal<bool>,
pub is_hovered: Signal<bool>,
pub is_focused: Signal<bool>,
pub is_disabled: Signal<bool>,
pub orientation: TabBarOrientation,
pub indicator_position: TabIndicatorPosition,
}
#[derive(Clone, Debug)]
pub struct TabBarChromeConfig {
pub content: WidgetId,
pub orientation: TabBarOrientation,
pub show_separator: bool,
pub surface_role: Option<ColorProp>,
pub drop_indicator: Signal<Option<f32>>,
}
pub trait TabStyle: 'static {
fn make_body(&self, cfg: &TabStyleConfig, ctx: &mut BuildContext) -> WidgetId;
fn make_bar(&self, cfg: &TabBarChromeConfig, ctx: &mut BuildContext) -> WidgetId;
fn editor_height(&self, tokens: &InputTokens) -> f32 {
dp(50.0, TargetRole::Target, tokens)
}
fn padding_horizontal(&self, tokens: &InputTokens) -> f32 {
spacing(12.0, tokens)
}
}
pub type SharedTabStyle = Rc<dyn TabStyle>;