123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114(** CSS rule t types and smart constructors *)moduleCss=Cascade.Csstypet=|Regularof{selector:Css.Selector.t;props:Css.declarationlist;base_class:stringoption;(* Base class name without the dot *)has_hover:bool;(* Track if this rule has hover modifier *)nested:Css.statementlist;(* Nested statements (e.g., @media) *)merge_key:stringoption;}|Media_queryof{condition:Css.Media.t;selector:Css.Selector.t;props:Css.declarationlist;base_class:stringoption;nested:Css.statementlist;(* Nested statements for compound modifiers *)}|Container_queryof{condition:Css.Container.t;selector:Css.Selector.t;props:Css.declarationlist;base_class:stringoption;nested:Css.statementlist;}|Starting_styleof{selector:Css.Selector.t;props:Css.declarationlist;base_class:stringoption;nested:Css.statementlist;}|Supports_queryof{condition:Css.Supports.t;selector:Css.Selector.t;props:Css.declarationlist;base_class:stringoption;merge_key:stringoption;nested:Css.statementlist;}typeby_type={regular:tlist;media:tlist;container:tlist;starting:tlist;supports:tlist;}letregular~selector~props?base_class?(has_hover=false)?(nested=[])?merge_key()=Regular{selector;props;base_class;has_hover;nested;merge_key}letmedia_query~condition~selector~props?base_class?(nested=[])()=Media_query{condition;selector;props;base_class;nested}letcontainer_query~condition~selector~props?base_class?(nested=[])()=Container_query{condition;selector;props;base_class;nested}letstarting_style~selector~props?base_class?(nested=[])()=Starting_style{selector;props;base_class;nested}letsupports_query~condition~selector~props?base_class?merge_key?(nested=[])()=Supports_query{condition;selector;props;base_class;merge_key;nested}letbase_class=function|Regular{base_class;_}|Media_query{base_class;_}|Container_query{base_class;_}|Starting_style{base_class;_}|Supports_query{base_class;_}->base_classletpp=function|Regular{selector;_}->"Regular("^Css.Selector.to_stringselector^")"|Media_query{selector;_}->"Media_query("^Css.Selector.to_stringselector^")"|Container_query{selector;_}->"Container_query("^Css.Selector.to_stringselector^")"|Starting_style{selector;_}->"Starting_style("^Css.Selector.to_stringselector^")"|Supports_query{selector;_}->"Supports_query("^Css.Selector.to_stringselector^")"letis_hover_rule=function|Regular{has_hover;_}->has_hover|_->falseletclassify_by_typeall_rules=let(regular_rules,media_rules,container_rules,starting_rules,supports_rules)=List.fold_left(fun(reg,media,cont,start,sup)rule->matchrulewith|Regular_->(rule::reg,media,cont,start,sup)|Media_query_->(reg,rule::media,cont,start,sup)|Container_query_->(reg,media,rule::cont,start,sup)|Starting_style_->(reg,media,cont,rule::start,sup)|Supports_query_->(reg,media,cont,start,rule::sup))([],[],[],[],[])all_rulesin{regular=List.revregular_rules;media=List.revmedia_rules;container=List.revcontainer_rules;starting=List.revstarting_rules;supports=List.revsupports_rules;}