Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file flex_props.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431(** Flexbox property utilities (grow, shrink, basis, order, flex shortcuts).
These utilities control flexbox item behavior and come after sizing
utilities in the cascade order. For flex display utilities (flex,
inline-flex), see Flex module. For direction/wrap utilities, see Flex_layout
module. *)moduleCss=Cascade.CssmoduleHandler=structopenStyleopenCsstypet=(* Flex shortcuts *)|Flex_1|Flex_auto|Flex_initial|Flex_none|Flex_nofint(* flex-N where N is any integer *)|Flex_fractionofint*int(* flex-N/M where N/M is a fraction *)|Flex_arbitraryofint(* flex-[123] *)(* Grow *)|Flex_grow|Flex_grow_0|Flex_grow_arbitraryofint(* grow-[123] *)|Flex_grow_legacy(* flex-grow (deprecated alias, keeps its class name) *)|Flex_grow_0_legacy(* flex-grow-0 *)(* Shrink *)|Flex_shrink|Flex_shrink_0|Flex_shrink_arbitraryofint(* shrink-[123] *)|Flex_shrink_legacy(* flex-shrink *)|Flex_shrink_0_legacy(* flex-shrink-0 *)(* Basis *)|Basis_0|Basis_1|Basis_spacingofint|Basis_auto|Basis_full|Basis_fractionofint*int|Basis_namedofstring|Basis_arbitraryofCss.flex_basis(* basis-[123px] *)(* Order *)|Orderofint|Neg_orderofint(* -order-4 = calc(4 * -1) *)|Neg_order_arbitraryofstring(* -order-[var(--value)] *)|Order_arbitraryofstring(* order-[123] *)|Order_first|Order_last|Order_nonetypeUtility.base+=Selfoftletname="flex_props"(* flex/grow/shrink/basis are the flexbox family (priority 7 - after sizing,
before transforms). order- occupies an early canonical slot (rank 13, right
after z-index), so it returns priority 0 with a suborder above z-index's
~20M band and below container (priority 1). *)letpriority=function|Order_|Neg_order_|Neg_order_arbitrary_|Order_arbitrary_|Order_first|Order_last|Order_none->0|_->7(* Flex shortcuts *)letflex_1=style[flex(Grow(Number1.0))]letflex_auto=style[flexAuto]letflex_initial=style[flex(Full(Number0.,Number1.,Auto))]letflex_none=style[flexNone](* flex-N: flex: N *)letflex_n_stylen=style[flex(Grow(Number(float_of_intn)))](* flex-N/M: flex: (N/M * 100)% - evaluates the fraction *)letflex_fraction_stylenm=letpct_value=float_of_intn/.float_of_intm*.100.0instyle[flex(Basis(Pctpct_value))](* Grow *)letflex_grow_utility=style[flex_grow1.0]letflex_grow_0_utility=style[flex_grow0.0](* Shrink *)letflex_shrink_utility=style[flex_shrink1.0]letflex_shrink_0_utility=style[flex_shrink0.0](* Basis. Tailwind v4.3 emits [var(--spacing)] for [basis-1] and
[calc(var(--spacing) * <n>)] otherwise; [basis-full] / [basis-1/1] emit
literal [100%]. *)letbasis_spacingn=letspacing_decl,_=Var.bindingTheme.spacing_varTheme.spacing_baseinletvalue:Css.flex_basis=ifn=1thenVar(Var.theme_ref"spacing")elseCalcCss.Calc.(mul(var"spacing")(float(float_of_intn)))instyle[spacing_decl;flex_basisvalue]letbasis_0=basis_spacing0letbasis_1=basis_spacing1letbasis_auto=style[flex_basisAuto]letbasis_full=style[flex_basis(Pct100.0)]letbasis_fraction_stylenm=letraw=float_of_intn/.float_of_intm*.100.0inletpct_value=Float.round(raw*.10000.0)/.10000.0instyle[flex_basis(Pctpct_value)]letbasis_named_style?themename=letvar_name="container-"^nameinmatchScheme.theme_valuethemevar_namewith|Somevalue_str->letdecl=Css.custom_property~layer:"theme"("--"^var_name)value_strinletref:Css.flex_basisCss.var=Var.theme_refvar_name~default:(Css.Zero:Css.flex_basis)~default_css:"0px"instyle[decl;flex_basis(Varref)]|None->letref:Css.flex_basisCss.var=Var.theme_refvar_name~default:(Css.Zero:Css.flex_basis)~default_css:"0px"instyle[flex_basis(Varref)](* Order *)letorder_stylen=style[order(Intn)]letthemed_order?themenamedefault=matchScheme.theme_valuethemenamewith|None->style[order(Intdefault)]|Somevalue->letdecl=Css.custom_property~layer:"theme"("--"^name)valueinletvar_ref=Css.var_ref~layer:"theme"nameinstyle[decl;order(Varvar_ref)]letorder_first?theme()=themed_order?theme"order-first"(-9999)letorder_last?theme()=themed_order?theme"order-last"9999letorder_none=style[order(Int0)]letto_styletheme=letbasis_named_stylename=basis_named_style~themenameinletorder_first()=order_first~theme()inletorder_last()=order_last~theme()infunction|Flex_1->flex_1|Flex_auto->flex_auto|Flex_initial->flex_initial|Flex_none->flex_none|Flex_nn->flex_n_stylen|Flex_fraction(n,m)->flex_fraction_stylenm|Flex_arbitraryn->flex_n_stylen|Flex_grow->flex_grow_utility|Flex_grow_0->flex_grow_0_utility|Flex_grow_arbitraryn->style[flex_grow(float_of_intn)]|Flex_grow_legacy->flex_grow_utility|Flex_grow_0_legacy->flex_grow_0_utility|Flex_shrink->flex_shrink_utility|Flex_shrink_0->flex_shrink_0_utility|Flex_shrink_arbitraryn->style[flex_shrink(float_of_intn)]|Flex_shrink_legacy->flex_shrink_utility|Flex_shrink_0_legacy->flex_shrink_0_utility|Basis_0->basis_0|Basis_1->basis_1|Basis_spacingn->basis_spacingn|Basis_auto->basis_auto|Basis_full->basis_full|Basis_fraction(n,m)->basis_fraction_stylenm|Basis_namedname->basis_named_stylename|Basis_arbitrarylen->style[flex_basislen]|Ordern->order_stylen|Neg_ordern->style[order(Int(-n))]|Neg_order_arbitrarys->(matchint_of_string_optswith|Somen->style[order(Int(-n))]|None->leto=Css.Properties.read_order(Cascade.Cursor.of_strings)instyle[order(Calc(Css.Calc.mul(Valo)(Css.Calc.float(-1.))))])|Order_arbitrarys->style[order(Css.Properties.read_order(Cascade.Cursor.of_strings))]|Order_first->order_first()|Order_last->order_last()|Order_none->order_noneletsuborder:t->int=function(* Order (priority 0) - after z-index (~20M band in layout.ml), before
container (priority 1). Ordering: negative first, then positive, then
first/last/none, then arbitrary. *)|Neg_ordern->21_000_000+n(* negative comes first *)|Neg_order_arbitrary_->21_000_000+50|Ordern->21_000_000+100+n|Order_arbitrary_->21_000_000+150|Order_first->21_000_000+200|Order_last->21_000_000+201|Order_none->21_000_000+202(* Tailwind flex order: flex-1 < fractions < numbers < auto < initial <
none. Note: flex-* utilities come AFTER order-* utilities *)|Flex_1->1000(* Fractions: sorted by numerator then denominator (1/2 < 1/3 < 1/4 <
2/3...) *)|Flex_fraction(n,m)->1020+(n*100)+m(* flex-N values: after fractions, ordered by value *)|Flex_nn->5000+n(* Arbitrary flex values - after regular numbers *)|Flex_arbitraryn->6000+n(* Named shortcuts come last *)|Flex_auto->10000|Flex_initial->10001|Flex_none->10002(* Shrink - legacy flex-shrink* sorts before the canonical shrink* *)|Flex_shrink_legacy->19998|Flex_shrink_0_legacy->19999|Flex_shrink->20000|Flex_shrink_0->20001|Flex_shrink_arbitrary_->20002(* Grow - legacy flex-grow* sorts before the canonical grow* *)|Flex_grow_legacy->29998|Flex_grow_0_legacy->29999|Flex_grow->30000|Flex_grow_0->30001|Flex_grow_arbitrary_->30002(* Basis: fractions → arbitrary → keywords alphabetical → named *)|Basis_fraction(n,m)->40000+(n*10)+m|Basis_arbitrary_->42000|Basis_0->43000|Basis_1->43001|Basis_spacing_->43001|Basis_auto->43002|Basis_full->43003|Basis_named_->44000leterr_not_utility=Error(`Msg"Not a flex property utility")letparse_fractions=(* Parse "N/M" into (N, M) *)matchString.split_on_char'/'swith|[n_str;m_str]->(match(int_of_string_optn_str,int_of_string_optm_str)with|Somen,Somemwhenn>0&&m>0->Some(n,m)|_->None)|_->Noneletof_class_themeclass_name=letparts=Parse.split_classclass_nameinmatchpartswith|["flex";"1"]->OkFlex_1|["flex";"auto"]->OkFlex_auto|["flex";"initial"]->OkFlex_initial|["flex";"none"]->OkFlex_none|["flex";"grow"]->OkFlex_grow_legacy|["grow"]->OkFlex_grow|["flex";"grow";"0"]->OkFlex_grow_0_legacy|["grow";"0"]->OkFlex_grow_0|["grow";n]whenParse.is_bracket_valuen->(letinner=Parse.bracket_innerninmatchint_of_string_optinnerwith|Somei->Ok(Flex_grow_arbitraryi)|None->err_not_utility)|["flex";"shrink"]->OkFlex_shrink_legacy|["shrink"]->OkFlex_shrink|["flex";"shrink";"0"]->OkFlex_shrink_0_legacy|["shrink";"0"]->OkFlex_shrink_0|["shrink";n]whenParse.is_bracket_valuen->(letinner=Parse.bracket_innerninmatchint_of_string_optinnerwith|Somei->Ok(Flex_shrink_arbitraryi)|None->err_not_utility)|["basis";"0"]->OkBasis_0|["basis";"1"]->OkBasis_1|["basis";"auto"]->OkBasis_auto|["basis";"full"]->OkBasis_full|["basis";value]whenParse.is_bracket_valuevalue->letinner=Parse.bracket_innervalueinifString.ends_with~suffix:"px"innerthenletn=String.subinner0(String.lengthinner-2)inmatchfloat_of_string_optnwith|Somef->Ok(Basis_arbitrary(Css.Pxf))|None->err_not_utilityelseifString.ends_with~suffix:"rem"innerthenletn=String.subinner0(String.lengthinner-3)inmatchfloat_of_string_optnwith|Somef->Ok(Basis_arbitrary(Css.Remf))|None->err_not_utilityelseerr_not_utility|["basis";value]->(matchint_of_string_optvaluewith|Somenwhenn>=0->Ok(Basis_spacingn)|_->(matchparse_fractionvaluewith|Some(n,m)->Ok(Basis_fraction(n,m))|None->ifSpacing.is_named_spacingvaluethenOk(Basis_namedvalue)elseerr_not_utility))|["order";"first"]->OkOrder_first|["order";"last"]->OkOrder_last|["order";"none"]->OkOrder_none|"order"::restwhenrest<>[]->(letvalue=String.concat"-"restinifString.lengthvalue>2&&value.[0]='['&&value.[String.lengthvalue-1]=']'thenletinner=String.subvalue1(String.lengthvalue-2)inOk(Order_arbitraryinner)elsematchint_of_string_optvaluewith|Somenwhenn>=0->Ok(Ordern)|_->err_not_utility)|""::"order"::restwhenrest<>[]->((* Negative order: -order-4, -order-[var(--value)] *)letvalue=String.concat"-"restinifString.lengthvalue>2&&value.[0]='['&&value.[String.lengthvalue-1]=']'thenletinner=String.subvalue1(String.lengthvalue-2)inOk(Neg_order_arbitraryinner)elsematchint_of_string_optvaluewith|Somenwhenn>=1->Ok(Neg_ordern)|_->err_not_utility)|["flex";value]whenString.lengthvalue>0&&value.[0]='['->(* Arbitrary flex: flex-[123] *)letlen=String.lengthvalueiniflen>2&&value.[len-1]=']'thenletinner=String.subvalue1(len-2)inmatchint_of_string_optinnerwith|Somen->Ok(Flex_arbitraryn)|None->err_not_utilityelseerr_not_utility|["flex";value]->((* Try fraction first (e.g., "1/2") *)matchparse_fractionvaluewith|Some(n,m)->Ok(Flex_fraction(n,m))|None->((* Try numeric value (e.g., "99") *)matchint_of_string_optvaluewith|Somenwhenn>1->Ok(Flex_nn)|_->err_not_utility))|_->err_not_utilityletto_class=function(* Flex shortcuts *)|Flex_1->"flex-1"|Flex_auto->"flex-auto"|Flex_initial->"flex-initial"|Flex_none->"flex-none"|Flex_nn->"flex-"^string_of_intn|Flex_fraction(n,m)->"flex-"^string_of_intn^"/"^string_of_intm|Flex_arbitraryn->"flex-["^string_of_intn^"]"(* Grow - Tailwind v4 uses shorter names; the flex-* spellings are kept as
deprecated aliases that preserve their class name *)|Flex_grow->"grow"|Flex_grow_0->"grow-0"|Flex_grow_arbitraryn->"grow-["^string_of_intn^"]"|Flex_grow_legacy->"flex-grow"|Flex_grow_0_legacy->"flex-grow-0"(* Shrink - Tailwind v4 uses shorter names *)|Flex_shrink->"shrink"|Flex_shrink_0->"shrink-0"|Flex_shrink_arbitraryn->"shrink-["^string_of_intn^"]"|Flex_shrink_legacy->"flex-shrink"|Flex_shrink_0_legacy->"flex-shrink-0"(* Basis *)|Basis_0->"basis-0"|Basis_1->"basis-1"|Basis_spacingn->"basis-"^string_of_intn|Basis_auto->"basis-auto"|Basis_full->"basis-full"|Basis_fraction(n,m)->"basis-"^string_of_intn^"/"^string_of_intm|Basis_nameds->"basis-"^s|Basis_arbitrarylen->(matchlenwith|Pxn->lets=string_of_floatninlets=ifString.ends_with~suffix:"."sthenString.subs0(String.lengths-1)elsesin"basis-["^s^"px]"|Remn->lets=string_of_floatninlets=ifString.ends_with~suffix:"."sthenString.subs0(String.lengths-1)elsesin"basis-["^s^"rem]"|_->"basis-[<length>]")(* Order *)|Ordern->"order-"^string_of_intn|Neg_ordern->"-order-"^string_of_intn|Neg_order_arbitrarys->"-order-["^s^"]"|Order_arbitrarys->"order-["^s^"]"|Order_first->"order-first"|Order_last->"order-last"|Order_none->"order-none"endopenHandler(** Register handler with Utility system *)let()=Utility.register(moduleHandler)letutilityx=Utility.base(Selfx)letflex_1=utilityFlex_1letflex_auto=utilityFlex_autoletflex_initial=utilityFlex_initialletflex_none=utilityFlex_noneletflex_grow=utilityFlex_growletflex_grow_0=utilityFlex_grow_0letflex_shrink=utilityFlex_shrinkletflex_shrink_0=utilityFlex_shrink_0letbasis_0=utilityBasis_0letbasis_1=utilityBasis_1letbasis_auto=utilityBasis_autoletbasis_full=utilityBasis_fullletordern=utility(Ordern)letorder_first=utilityOrder_firstletorder_last=utilityOrder_lastletorder_none=utilityOrder_none