Skip to main content

egui_macview/tokens/
mod.rs

1//! Typed W3C DTCG-compliant Design Token models for `egui-macview`.
2//!
3//! Grounded in Apple AppKit, macOS Human Interface Guidelines,
4//! Apple Typography specifications, and CoreAnimation spring physics.
5
6pub mod color;
7pub mod dtcg;
8pub mod metrics;
9pub mod motion;
10pub mod typography;
11
12pub use color::{MacAppearanceColors, MacColorTokens};
13pub use dtcg::{ColorValue, DimensionValue};
14pub use metrics::{
15    ButtonMetrics, ButtonSizeMetrics, ColorWellMetrics, ContextMenuMetrics, FocusRingMetrics,
16    FooterMetrics, LayoutMetrics, LevelIndicatorMetrics, MacControlMetrics, MacMetricsTokens,
17    MenuBarMetrics, NavigationMetrics, OutlineViewMetrics, PaletteMetrics, PathControlMetrics,
18    PopUpButtonMetrics, PopoverMetrics, ProgressIndicatorMetrics, ProgressSizeMetrics,
19    ScrollViewMetrics, SearchFieldMetrics, SegmentedMetrics, SegmentedSizeMetrics, SliderMetrics,
20    SplitViewMetrics, StackViewMetrics, StepperMetrics, TableViewMetrics, TextFieldMetrics,
21    TextFieldSizeMetrics, ThumbnailCellMetrics, ToastMetrics, ToggleMetrics, TokenFieldMetrics,
22    ToolbarMetrics, TrimScrubberMetrics, CANVAS_FOOTER_HEIGHT, COMMAND_PALETTE_HEIGHT,
23    COMMAND_PALETTE_WIDTH, DEFAULT_TOAST_DURATION,
24};
25pub use motion::{MacMotionTokens, MotionPresetToken};
26pub use typography::{
27    sf_pro_tracking, CubicCoefficients, CubicFit, MacTypographyTokens, PolynomialSpec001,
28    QuadraticCoefficients, QuadraticFit, TrackingPoint, TrackingTableEntry,
29};
30
31use serde::{Deserialize, Serialize};
32
33/// Inner container grouping the token subcategories.
34#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
35pub struct MacViewTokens {
36    /// Geometry and dimension tokens.
37    pub metrics: MacMetricsTokens,
38    /// Semantic color palettes for Aqua and DarkAqua.
39    pub color: MacColorTokens,
40    /// SF Pro typography and tracking tokens.
41    pub typography: MacTypographyTokens,
42    /// Spring physics and animation preset tokens.
43    pub motion: MacMotionTokens,
44}
45
46/// Root token catalog deserialized from `tokens/design_tokens.json`.
47#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
48pub struct MacDesignTokens {
49    /// Token catalog schema name.
50    #[serde(rename = "$name", default)]
51    pub name: String,
52    /// Token catalog schema version string.
53    #[serde(rename = "$version", default)]
54    pub version: String,
55    /// Catalog description.
56    #[serde(rename = "$description", default)]
57    pub description: String,
58    /// Root namespace holding all token subcategories.
59    pub macview: MacViewTokens,
60}
61
62impl MacDesignTokens {
63    /// Loads default design tokens from embedded `tokens/design_tokens.json`.
64    ///
65    /// Executes parsing within a dedicated stack thread (4MB) to guarantee immunity
66    /// against stack overflows on platforms with restricted default main stacks.
67    pub fn load_default() -> Self {
68        std::thread::Builder::new()
69            .name("mac_token_loader".into())
70            .stack_size(4 * 1024 * 1024)
71            .spawn(|| {
72                Self::from_json(include_str!("../../tokens/design_tokens.json"))
73                    .expect("Failed to parse embedded tokens/design_tokens.json")
74            })
75            .expect("Failed to spawn token loader thread")
76            .join()
77            .expect("Token loader panicked")
78    }
79
80    /// Deserializes `MacDesignTokens` from a JSON string.
81    pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
82        serde_json::from_str(json)
83    }
84
85    /// Accesses control metrics tokens.
86    #[inline]
87    pub fn control_metrics(&self) -> &MacControlMetrics {
88        &self.macview.metrics.control
89    }
90
91    /// Accesses toolbar metrics tokens.
92    #[inline]
93    pub fn toolbar_metrics(&self) -> &ToolbarMetrics {
94        &self.macview.metrics.toolbar
95    }
96
97    /// Accesses popover and panel metrics tokens.
98    #[inline]
99    pub fn popover_metrics(&self) -> &PopoverMetrics {
100        &self.macview.metrics.popover
101    }
102
103    /// Accesses split view metrics tokens.
104    #[inline]
105    pub fn split_view_metrics(&self) -> &SplitViewMetrics {
106        &self.macview.metrics.split_view
107    }
108
109    /// Accesses layout container metrics tokens.
110    #[inline]
111    pub fn layout_metrics(&self) -> &LayoutMetrics {
112        &self.macview.metrics.layout
113    }
114
115    /// Accesses scroll view metrics tokens.
116    #[inline]
117    pub fn scroll_view_metrics(&self) -> &ScrollViewMetrics {
118        &self.macview.metrics.layout.scroll_view
119    }
120
121    /// Accesses stack view metrics tokens.
122    #[inline]
123    pub fn stack_view_metrics(&self) -> &StackViewMetrics {
124        &self.macview.metrics.layout.stack_view
125    }
126
127    /// Accesses outline view metrics tokens.
128    #[inline]
129    pub fn outline_view_metrics(&self) -> &OutlineViewMetrics {
130        &self.macview.metrics.control.outline_view
131    }
132
133    /// Accesses slider metrics tokens.
134    #[inline]
135    pub fn slider_metrics(&self) -> &SliderMetrics {
136        &self.macview.metrics.control.slider
137    }
138
139    /// Accesses thumbnail metrics tokens.
140    #[inline]
141    pub fn thumbnail_metrics(&self) -> &ThumbnailCellMetrics {
142        &self.macview.metrics.control.thumbnail
143    }
144
145    /// Accesses popup button metrics tokens.
146    #[inline]
147    pub fn popup_button_metrics(&self) -> &PopUpButtonMetrics {
148        &self.macview.metrics.control.popup_button
149    }
150
151    /// Accesses search field metrics tokens.
152    #[inline]
153    pub fn search_field_metrics(&self) -> &SearchFieldMetrics {
154        &self.macview.metrics.control.search_field
155    }
156
157    /// Accesses stepper metrics tokens.
158    #[inline]
159    pub fn stepper_metrics(&self) -> &StepperMetrics {
160        &self.macview.metrics.control.stepper
161    }
162
163    /// Accesses color well metrics tokens.
164    #[inline]
165    pub fn color_well_metrics(&self) -> &ColorWellMetrics {
166        &self.macview.metrics.control.color_well
167    }
168
169    /// Accesses toggle switch metrics tokens.
170    #[inline]
171    pub fn toggle_metrics(&self) -> &ToggleMetrics {
172        &self.macview.metrics.control.toggle
173    }
174
175    /// Accesses navigation and feedback metrics tokens.
176    #[inline]
177    pub fn navigation_metrics(&self) -> &NavigationMetrics {
178        &self.macview.metrics.navigation
179    }
180
181    /// Accesses menu bar metrics tokens.
182    #[inline]
183    pub fn menu_bar_metrics(&self) -> &MenuBarMetrics {
184        &self.macview.metrics.navigation.menu_bar
185    }
186
187    /// Accesses canvas footer metrics tokens.
188    #[inline]
189    pub fn footer_metrics(&self) -> &FooterMetrics {
190        &self.macview.metrics.navigation.footer
191    }
192
193    /// Accesses command palette metrics tokens.
194    #[inline]
195    pub fn palette_metrics(&self) -> &PaletteMetrics {
196        &self.macview.metrics.navigation.palette
197    }
198
199    /// Accesses context menu metrics tokens.
200    #[inline]
201    pub fn context_menu_metrics(&self) -> &ContextMenuMetrics {
202        &self.macview.metrics.navigation.context_menu
203    }
204
205    /// Accesses toast notification metrics tokens.
206    #[inline]
207    pub fn toast_metrics(&self) -> &ToastMetrics {
208        &self.macview.metrics.navigation.toast
209    }
210
211    /// Accesses progress indicator metrics tokens.
212    #[inline]
213    pub fn progress_indicator_metrics(&self) -> &ProgressIndicatorMetrics {
214        &self.macview.metrics.control.progress_indicator
215    }
216
217    /// Accesses table view metrics tokens.
218    #[inline]
219    pub fn table_view_metrics(&self) -> &TableViewMetrics {
220        &self.macview.metrics.control.table_view
221    }
222
223    /// Accesses token field metrics tokens.
224    #[inline]
225    pub fn token_field_metrics(&self) -> &TokenFieldMetrics {
226        &self.macview.metrics.control.token_field
227    }
228
229    /// Accesses level indicator metrics tokens.
230    #[inline]
231    pub fn level_indicator_metrics(&self) -> &LevelIndicatorMetrics {
232        &self.macview.metrics.control.level_indicator
233    }
234
235    /// Accesses trim scrubber metrics tokens.
236    #[inline]
237    pub fn trim_scrubber_metrics(&self) -> &TrimScrubberMetrics {
238        &self.macview.metrics.control.trim_scrubber
239    }
240
241    /// Accesses path control metrics tokens.
242    #[inline]
243    pub fn path_control_metrics(&self) -> &PathControlMetrics {
244        &self.macview.metrics.control.path_control
245    }
246
247    /// Accesses semantic color tokens.
248    #[inline]
249    pub fn colors(&self) -> &MacColorTokens {
250        &self.macview.color
251    }
252
253    /// Accesses typography and optical tracking tokens.
254    #[inline]
255    pub fn typography(&self) -> &MacTypographyTokens {
256        &self.macview.typography
257    }
258
259    /// Accesses CoreAnimation motion preset tokens.
260    #[inline]
261    pub fn motion(&self) -> &MacMotionTokens {
262        &self.macview.motion
263    }
264}