use crate::error::Result;
use crate::responsive::Breakpoint;
use std::collections::HashMap;
use super::types::{CssRule, CssProperty, CssGenerationConfig};
use super::variants::VariantParser;
use super::parsers::{
SpacingParser, AnimationParser, InteractiveParser,
AdvancedSpacingParser, AdvancedColorParser, PositioningParser, TypographyParser,
FlexboxParser, LayoutParser, ColorParser, EffectsParser, SizingParser,
AdvancedBorderParser, RingParser, TransitionParser, ShadowParser, SvgParser,
MarginParser, GroupParser, AdvancedGridParser, ProseParser, DivideParser,
GradientParser, ObjectFitParser, TransformParser, ArbitraryParser, DataAttributeParser,
BackgroundPropertiesParser, TransitionPropertiesParser, FractionalTransformsParser,
AspectRatioParser, ColumnsParser, BreakControlParser, BoxUtilitiesParser, LayoutUtilitiesParser,
OverflowParser, OverscrollParser, PositionParser, InsetParser, VisibilityParser, ZIndexParser,
FlexBasisParser, FlexDirectionParser, FlexWrapParser, FlexParser, FlexGrowParser, FlexShrinkParser,
OrderParser, GridTemplateColumnsParser, GridColumnParser, GridTemplateRowsParser, GridRowParser,
GridAutoFlowParser, GridAutoColumnsParser, GridAutoRowsParser, GapParser, JustifyContentParser,
JustifyItemsParser, JustifySelfParser, AlignContentParser, AlignItemsParser, AlignSelfParser,
PlaceContentParser, PlaceItemsParser, PlaceSelfParser, BackgroundParser, BorderUtilitiesParser,
EffectsUtilitiesParser, FilterUtilitiesParser, BackdropFilterUtilitiesParser, AccessibilityParser, TableParser, MaskUtilitiesParser, AccentColorParser
};
#[derive(Debug, Clone)]
pub struct CssGenerator {
pub rules: HashMap<String, CssRule>,
pub breakpoints: HashMap<Breakpoint, String>,
pub custom_properties: HashMap<String, String>,
pub config: CssGenerationConfig,
pub spacing_parser: SpacingParser,
pub advanced_spacing_parser: AdvancedSpacingParser,
pub color_parser: ColorParser,
pub advanced_color_parser: AdvancedColorParser,
pub typography_parser: TypographyParser,
pub layout_parser: LayoutParser,
pub positioning_parser: PositioningParser,
pub flexbox_parser: FlexboxParser,
pub effects_parser: EffectsParser,
pub sizing_parser: SizingParser,
pub advanced_border_parser: AdvancedBorderParser,
pub ring_parser: RingParser,
pub transition_parser: TransitionParser,
pub shadow_parser: ShadowParser,
pub svg_parser: SvgParser,
pub margin_parser: MarginParser,
pub group_parser: GroupParser,
pub advanced_grid_parser: AdvancedGridParser,
pub animation_parser: AnimationParser,
pub interactive_parser: InteractiveParser,
pub prose_parser: ProseParser,
pub divide_parser: DivideParser,
pub gradient_parser: GradientParser,
pub object_fit_parser: ObjectFitParser,
pub transform_parser: TransformParser,
pub arbitrary_parser: ArbitraryParser,
pub data_attribute_parser: DataAttributeParser,
pub background_properties_parser: BackgroundPropertiesParser,
pub transition_properties_parser: TransitionPropertiesParser,
pub fractional_transforms_parser: FractionalTransformsParser,
pub aspect_ratio_parser: AspectRatioParser,
pub columns_parser: ColumnsParser,
pub break_control_parser: BreakControlParser,
pub box_utilities_parser: BoxUtilitiesParser,
pub layout_utilities_parser: LayoutUtilitiesParser,
pub overflow_parser: OverflowParser,
pub overscroll_parser: OverscrollParser,
pub position_parser: PositionParser,
pub inset_parser: InsetParser,
pub visibility_parser: VisibilityParser,
pub z_index_parser: ZIndexParser,
pub flex_basis_parser: FlexBasisParser,
pub flex_direction_parser: FlexDirectionParser,
pub flex_wrap_parser: FlexWrapParser,
pub flex_parser: FlexParser,
pub flex_grow_parser: FlexGrowParser,
pub flex_shrink_parser: FlexShrinkParser,
pub order_parser: OrderParser,
pub grid_template_columns_parser: GridTemplateColumnsParser,
pub grid_column_parser: GridColumnParser,
pub grid_template_rows_parser: GridTemplateRowsParser,
pub grid_row_parser: GridRowParser,
pub grid_auto_flow_parser: GridAutoFlowParser,
pub grid_auto_columns_parser: GridAutoColumnsParser,
pub grid_auto_rows_parser: GridAutoRowsParser,
pub gap_parser: GapParser,
pub justify_content_parser: JustifyContentParser,
pub justify_items_parser: JustifyItemsParser,
pub justify_self_parser: JustifySelfParser,
pub align_content_parser: AlignContentParser,
pub align_items_parser: AlignItemsParser,
pub align_self_parser: AlignSelfParser,
pub place_content_parser: PlaceContentParser,
pub place_items_parser: PlaceItemsParser,
pub place_self_parser: PlaceSelfParser,
pub background_parser: BackgroundParser,
pub border_utilities_parser: BorderUtilitiesParser,
pub effects_utilities_parser: EffectsUtilitiesParser,
pub filter_utilities_parser: FilterUtilitiesParser,
pub backdrop_filter_utilities_parser: BackdropFilterUtilitiesParser,
pub accessibility_parser: AccessibilityParser,
pub table_parser: TableParser,
pub mask_utilities_parser: MaskUtilitiesParser,
pub accent_color_parser: AccentColorParser,
pub variant_parser: VariantParser,
}
impl Default for CssGenerator {
fn default() -> Self {
Self::new()
}
}
impl CssGenerator {
pub fn new() -> Self {
use super::generator_builders::CssGeneratorBuilder;
<Self as CssGeneratorBuilder>::new()
}
pub fn with_config(config: CssGenerationConfig) -> Self {
use super::generator_builders::CssGeneratorBuilder;
<Self as CssGeneratorBuilder>::with_config(config)
}
pub fn add_class(&mut self, class: &str) -> Result<()> {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::add_class(self, class)
}
pub fn add_css_selector(&mut self, selector: &str, properties: &str) -> Result<()> {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::add_css_selector(self, selector, properties)
}
pub fn add_responsive_class(&mut self, breakpoint: Breakpoint, class: &str) -> Result<()> {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::add_responsive_class(self, breakpoint, class)
}
pub fn add_custom_property(&mut self, name: &str, value: &str) {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::add_custom_property(self, name, value)
}
pub fn config(&self) -> &CssGenerationConfig {
&self.config
}
pub fn set_config(&mut self, config: CssGenerationConfig) {
self.config = config;
}
pub fn rules(&self) -> &HashMap<String, CssRule> {
&self.rules
}
pub fn rule_count(&self) -> usize {
self.rules.len()
}
pub fn generate_comprehensive_css(&mut self, _config: &CssGenerationConfig) -> Result<String> {
let common_classes = vec![
"p-4", "m-4", "bg-blue-500", "text-white", "rounded-md",
"hover:bg-blue-600", "focus:outline-none", "sm:p-6", "md:p-8"
];
for class in common_classes {
let _ = self.add_class(class);
}
Ok(self.generate_css())
}
pub fn get_rules(&self) -> &HashMap<String, CssRule> {
&self.rules
}
pub fn remove_rule(&mut self, selector: &str) {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::remove_rule(self, selector)
}
pub fn update_rule(&mut self, selector: &str, rule: CssRule) {
use super::generator_operations::CssGeneratorOperations;
<Self as CssGeneratorOperations>::update_rule(self, selector, rule)
}
pub fn generate_css(&self) -> String {
super::css_output::CssOutputGenerator::generate_css(&self.rules, &self.custom_properties)
}
pub fn generate_minified_css(&self) -> String {
super::css_output::CssOutputGenerator::generate_minified_css(&self.rules, &self.custom_properties)
}
pub fn class_to_css_rule(&self, class: &str) -> Result<CssRule> {
let (variants, base_class) = self.parse_variants(class);
let properties = self.class_to_properties(class)?;
let mut selector = String::new();
for variant in &variants {
let variant_selector = self.variant_parser.get_variant_selector(variant);
if !variant_selector.is_empty() {
selector.push_str(&variant_selector);
}
}
selector.push_str(&format!(".{}", base_class));
let media_query = variants.iter()
.find_map(|variant| {
if let Some(responsive_query) = self.variant_parser.get_responsive_media_query(variant) {
Some(responsive_query)
} else {
self.variant_parser.get_device_media_query(variant)
}
});
Ok(CssRule {
selector,
properties,
media_query: media_query.map(|s| s.to_string()),
specificity: variants.len() as u32 * 10, })
}
fn parse_variants(&self, class: &str) -> (Vec<String>, String) {
self.variant_parser.parse_variants(class)
}
pub fn class_to_properties(&self, class: &str) -> Result<Vec<CssProperty>> {
use super::generator_parsers::CssGeneratorParsers;
<Self as CssGeneratorParsers>::class_to_properties(self, class)
}
}