use crate::tokens::dtcg::DimensionValue;
use crate::tokens::metrics::controls::MacControlMetrics;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ToolbarMetrics {
pub traffic_lights_inset: DimensionValue,
pub height_unified: DimensionValue,
pub height_compact: DimensionValue,
pub icon_size: DimensionValue,
pub hit_target_width: DimensionValue,
pub hit_target_height: DimensionValue,
pub hit_target_min: DimensionValue,
pub item_spacing: DimensionValue,
pub item_spacing_compact: DimensionValue,
pub edge_padding: DimensionValue,
#[serde(default = "default_caption_button_width")]
pub caption_button_width: DimensionValue,
#[serde(default = "default_caption_button_height")]
pub caption_button_height: DimensionValue,
#[serde(default = "default_caption_icon_size")]
pub caption_icon_size: DimensionValue,
#[serde(default = "default_traffic_light_radius")]
pub traffic_light_radius: DimensionValue,
#[serde(default = "default_traffic_light_spacing")]
pub traffic_light_spacing: DimensionValue,
}
fn default_caption_button_width() -> DimensionValue {
DimensionValue::from_pt(46.0)
}
fn default_caption_button_height() -> DimensionValue {
DimensionValue::from_pt(32.0)
}
fn default_caption_icon_size() -> DimensionValue {
DimensionValue::from_pt(10.0)
}
fn default_traffic_light_radius() -> DimensionValue {
DimensionValue::from_pt(6.0)
}
fn default_traffic_light_spacing() -> DimensionValue {
DimensionValue::from_pt(8.0)
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PopoverMetrics {
pub arrow_base_width: DimensionValue,
pub arrow_height: DimensionValue,
pub arrow_tip_radius: DimensionValue,
pub arrow_base_radius: DimensionValue,
pub corner_radius: DimensionValue,
pub border_width: DimensionValue,
pub compact_panel_width: DimensionValue,
pub compact_panel_height: DimensionValue,
pub wing_width: DimensionValue,
pub wing_height: DimensionValue,
pub full_popover_width: DimensionValue,
pub full_popover_height: DimensionValue,
pub shadow_blur: DimensionValue,
pub shadow_y_offset: DimensionValue,
#[serde(default = "default_popover_header_height")]
pub header_height: DimensionValue,
#[serde(default = "default_popover_header_font_size")]
pub header_font_size: DimensionValue,
#[serde(default = "default_popover_inner_padding")]
pub inner_padding: DimensionValue,
}
fn default_popover_header_height() -> DimensionValue {
DimensionValue::from_pt(22.0)
}
fn default_popover_header_font_size() -> DimensionValue {
DimensionValue::from_pt(11.0)
}
fn default_popover_inner_padding() -> DimensionValue {
DimensionValue::from_pt(8.0)
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SplitViewMetrics {
pub divider_thickness: DimensionValue,
pub hit_thickness: DimensionValue,
pub min_pane_size: DimensionValue,
pub handle_length: DimensionValue,
pub handle_thickness: DimensionValue,
#[serde(default = "default_split_default_ratio")]
pub default_ratio: DimensionValue,
}
fn default_split_default_ratio() -> DimensionValue {
DimensionValue::from_pt(0.5)
}
impl Default for SplitViewMetrics {
fn default() -> Self {
Self {
divider_thickness: DimensionValue::from_pt(1.0),
hit_thickness: DimensionValue::from_pt(6.0),
min_pane_size: DimensionValue::from_pt(50.0),
handle_length: DimensionValue::from_pt(24.0),
handle_thickness: DimensionValue::from_pt(3.0),
default_ratio: default_split_default_ratio(),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScrollViewMetrics {
pub scrollbar_thickness: DimensionValue,
pub thumb_min_length: DimensionValue,
pub corner_radius: DimensionValue,
pub fade_timeout: DimensionValue,
pub edge_inset: DimensionValue,
#[serde(default = "default_scroll_view_hit_zone_padding")]
pub hit_zone_padding: DimensionValue,
#[serde(default = "default_scroll_view_min_visible_thumb_length")]
pub min_visible_thumb_length: DimensionValue,
}
fn default_scroll_view_hit_zone_padding() -> DimensionValue {
DimensionValue::from_pt(8.0)
}
fn default_scroll_view_min_visible_thumb_length() -> DimensionValue {
DimensionValue::from_pt(2.0)
}
impl Default for ScrollViewMetrics {
fn default() -> Self {
Self {
scrollbar_thickness: DimensionValue::from_pt(7.0),
thumb_min_length: DimensionValue::from_pt(20.0),
corner_radius: DimensionValue::from_pt(3.5),
fade_timeout: DimensionValue::from_pt(0.8),
edge_inset: DimensionValue::from_pt(3.0),
hit_zone_padding: default_scroll_view_hit_zone_padding(),
min_visible_thumb_length: default_scroll_view_min_visible_thumb_length(),
}
}
}
fn default_section_header_font_size() -> DimensionValue {
DimensionValue::from_pt(11.0)
}
fn default_stack_view_item_height() -> DimensionValue {
DimensionValue::from_pt(22.0)
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StackViewMetrics {
pub default_spacing: DimensionValue,
pub edge_padding: DimensionValue,
pub separator_thickness: DimensionValue,
#[serde(default = "default_section_header_font_size")]
pub section_header_font_size: DimensionValue,
#[serde(default = "default_stack_view_item_height")]
pub default_item_height: DimensionValue,
}
impl Default for StackViewMetrics {
fn default() -> Self {
Self {
default_spacing: DimensionValue::from_pt(8.0),
edge_padding: DimensionValue::from_pt(8.0),
separator_thickness: DimensionValue::from_pt(1.0),
section_header_font_size: DimensionValue::from_pt(11.0),
default_item_height: default_stack_view_item_height(),
}
}
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct LayoutMetrics {
#[serde(default)]
pub scroll_view: ScrollViewMetrics,
#[serde(default)]
pub stack_view: StackViewMetrics,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MacMetricsTokens {
pub control: MacControlMetrics,
pub toolbar: ToolbarMetrics,
pub popover: PopoverMetrics,
#[serde(default)]
pub split_view: SplitViewMetrics,
#[serde(default)]
pub layout: LayoutMetrics,
}