1pub mod arbitrary;
42pub mod ast_parser;
43pub mod classes;
44pub mod class_scanner;
45pub mod color;
46pub mod config;
47pub mod css_generator;
48pub mod css_optimizer;
49pub mod custom_variant;
50pub mod dark_mode;
51pub mod error;
52pub mod performance;
54pub mod plugin_system;
55pub mod responsive;
56#[cfg(feature = "postcss")]
57pub mod postcss_integration;
58pub mod enhanced_variants;
59
60#[cfg(feature = "postcss")]
61#[cfg(test)]
62mod postcss_integration_test;
63pub mod theme;
64pub mod theme_new;
65pub mod tree_shaker;
66pub mod utils;
67pub mod utilities;
68pub mod validation;
69
70#[cfg(test)]
71mod property_tests;
72
73#[cfg(test)]
74mod api_stability;
75
76pub use arbitrary::{ArbitraryValue, ArbitraryValueError, ArbitraryValueUtilities};
87pub use ast_parser::AstParser;
88pub use classes::{ClassBuilder, ClassSet};
89pub use class_scanner::{ClassScanner, ScanConfig, ScanResults, ScanStats};
90pub use color::Color;
91pub use config::{BuildConfig, TailwindConfig};
92pub use config::parser::ConfigParser;
93pub use css_generator::{CssGenerator, CssProperty, CssRule, CssGenerationConfig};
94pub use css_optimizer::{OptimizationConfig, OptimizationResults, OptimizationStats};
95pub use custom_variant::{CustomVariant, CustomVariantManager, CustomVariantType};
96pub use dark_mode::{DarkModeVariant, DarkModeVariantError, DarkModeVariantUtilities};
97pub use error::{Result, TailwindError};
98pub use performance::{CacheStats, ClassCache, OptimizationLevel, PerformanceOptimizer};
100pub use plugin_system::{Plugin, PluginContext, PluginHook, PluginRegistry};
101pub use responsive::{
102 AlignItems, Breakpoint, FlexDirection, FlexWrap, JustifyContent, Responsive, ResponsiveBuilder,
103 ResponsiveFlex, ResponsiveGrid, ResponsiveValue, State,
104};
105pub use theme::{BorderRadius, BoxShadow, Spacing, Theme, ThemeValue};
106pub use theme_new::{
107 AnimationScale, BorderScale, FontFamily, FontSizeScale, FontWeightScale, LetterSpacingScale,
108 LineHeightScale, ShadowScale, SpacingScale, SpacingSize, Theme as NewTheme, ThemePreset,
109 ThemeVariant, ThemedComponent, TypographyScale,
110};
111pub use tree_shaker::{TreeShaker, TreeShakeConfig, TreeShakeResults, TreeShakeStats};
112pub use utilities::*;
113pub use validation::*;
114
115#[cfg(feature = "postcss")]
116pub use postcss_integration::{EnhancedCssGenerator, EnhancedCssResult, PostCSSIntegrationConfig};
117pub use enhanced_variants::{
118 EnhancedVariantParser, VariantDefinition, VariantType, CustomVariant as EnhancedCustomVariant,
119 VariantCombination, ParsedVariant, VariantParseResult, VariantMetadata
120};
121
122pub fn generate_css_file(output_path: &str, classes: Option<&ClassSet>) -> Result<()> {
155 let mut generator = CssGenerator::new();
156
157 if let Some(class_set) = classes {
159 for class in &class_set.classes {
161 generator.add_class(class)?;
162 }
163
164 for (breakpoint, responsive_classes) in &class_set.responsive {
166 for class in responsive_classes {
167 generator.add_responsive_class(*breakpoint, class)?;
168 }
169 }
170
171 for (_condition, conditional_classes) in &class_set.conditional {
173 for class in conditional_classes {
174 generator.add_class(class)?;
177 }
178 }
179 } else {
180 let config = CssGenerationConfig::default();
182 generator.generate_comprehensive_css(&config)?;
183 }
184
185 let css = generator.generate_css();
187
188 if let Some(parent) = std::path::Path::new(output_path).parent() {
190 std::fs::create_dir_all(parent)?;
191 }
192
193 std::fs::write(output_path, css)?;
195
196 println!("✅ CSS generated successfully at {}", output_path);
197 println!("📊 Generated {} CSS rules", generator.rule_count());
198
199 Ok(())
200}
201
202pub fn generate_comprehensive_css(output_path: &str, config: &CssGenerationConfig) -> Result<()> {
229 let mut generator = CssGenerator::new();
230
231 let css = generator.generate_comprehensive_css(config)?;
233
234 if let Some(parent) = std::path::Path::new(output_path).parent() {
236 std::fs::create_dir_all(parent)?;
237 }
238
239 std::fs::write(output_path, css)?;
241
242 println!("✅ Comprehensive CSS generated successfully at {}", output_path);
243 println!("📊 Generated {} CSS rules", generator.rule_count());
244
245 Ok(())
246}
247
248#[cfg(test)]
249mod tests {
250 mod sync_api_tests;
251 use super::*;
254
255 #[test]
256 fn test_version_constant() {
257 assert!(!VERSION.is_empty());
258 assert!(VERSION.chars().any(|c| c.is_ascii_digit()));
259 }
260
261 #[test]
262 fn test_defaults() {
263 assert_eq!(defaults::DEFAULT_THEME, "default");
264 assert_eq!(defaults::DEFAULT_BREAKPOINT, Breakpoint::Base);
265 assert_eq!(defaults::default_color(), Color::Blue);
266 }
267}
268
269pub struct TailwindBuilder;
271
272impl Default for TailwindBuilder {
273 fn default() -> Self {
274 Self::new()
275 }
276}
277
278impl TailwindBuilder {
279 pub fn new() -> Self {
280 Self
281 }
282
283 pub fn scan_source(self, _path: &std::path::Path) -> Self {
284 self
285 }
286
287 pub fn output_css(self, _path: &std::path::Path) -> Self {
288 self
289 }
290
291 pub fn config_file(self, _path: &std::path::Path) -> Self {
292 self
293 }
294
295 pub fn enable_tree_shaking(self) -> Self {
296 self
297 }
298
299 pub fn enable_minification(self) -> Self {
300 self
301 }
302
303 pub fn enable_source_maps(self) -> Self {
304 self
305 }
306
307 pub fn build(self) -> Result<()> {
308 let mut generator = CssGenerator::new();
310
311 generator.add_class("p-4")?;
314 generator.add_class("bg-blue-500")?;
315 generator.add_class("text-white")?;
316 generator.add_class("rounded-md")?;
317
318 let css = generator.generate_css();
320
321 let output_path = "dist/styles.css";
323 std::fs::create_dir_all("dist")?;
324 std::fs::write(output_path, css)?;
325
326 println!("✅ CSS generated successfully at {}", output_path);
327 println!("📊 Generated {} CSS rules", generator.rule_count());
328
329 Ok(())
330 }
331}
332
333
334pub const VERSION: &str = env!("CARGO_PKG_VERSION");
336
337pub mod defaults {
339 use super::*;
340
341 pub const DEFAULT_THEME: &str = "default";
342 pub const DEFAULT_BREAKPOINT: Breakpoint = Breakpoint::Base;
343 pub const DEFAULT_SPACING: Spacing = Spacing::Rem(1.0);
344
345 pub fn default_color() -> Color {
346 Color::Blue
347 }
348}
349