Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file layout.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883(** Layout utilities for basic display, positioning, and object properties *)moduleCss=Cascade.Css(** Screen reader utilities handler - priority 0 to appear first *)moduleScreen_reader_handler=structopenStyleopenCsstypet=Sr_only|Not_sr_onlyletname="screen_reader"letpriority_=0letsuborder=function(* Negative suborders to appear before absolute (suborder 0) *)|Sr_only->-2|Not_sr_only->-1letto_class=functionSr_only->"sr-only"|Not_sr_only->"not-sr-only"letto_style_theme=function|Sr_only->(* Property order matches Tailwind: position, width, height, padding,
margin, overflow, clip-path, white-space, border-width *)style[Css.positionAbsolute;width(Px1.);height(Px1.);padding[Zero];margin[Px(-1.)];overflowHidden;clip_path(Css.Clip_path_inset{top=Pct50.;right=None;bottom=None;left=None;rounded=None;});white_spaceNowrap;border_widthZero;]|Not_sr_only->(* Property order matches Tailwind: position, width, height, padding,
margin, overflow, clip-path, white-space *)style[Css.positionStatic;widthAuto;heightAuto;padding[Zero];margin[Zero];overflowVisible;clip_pathCss.Clip_path_none;white_spaceNormal;]letof_class_themeclass_name=letparts=Parse.split_classclass_nameinmatchpartswith|["sr";"only"]->OkSr_only|["not";"sr";"only"]->OkNot_sr_only|_->Error(`Msg"Not a screen reader utility")letexamples=[]end(* Theme variable for z-index-auto. When the threaded theme overrides this token
(e.g. an [@theme] block sets [--z-index-auto: 42]), produces a custom
declaration --z-index-auto: 42 in the :root, :host block. *)letz_index_auto_var=Var.themeCss.Z_index"z-index-auto"~order:(4,750)(* Generate z-auto style: either theme var with custom declaration, or bare
theme_ref fallback *)letz_auto_style?theme()=matchScheme.theme_valuetheme"z-index-auto"with|Somevalue_str->(* Parse theme value as z_index *)letz_value:Css.z_index=matchvalue_strwith|"auto"->Auto|s->Css.Properties.read_z_index(Cascade.Cursor.of_strings)inletdecl,ref=Var.bindingz_index_auto_varz_valueinStyle.style[decl;Css.z_index(Varref)](* Without a theme override Tailwind writes the keyword, not a reference to a
token nothing declares. *)|None->Style.style[Css.z_indexAuto](* An [object-[...]] value that is not a var() reference is a <position>, read
with cascade's grammar for it rather than a local one. Splitting on the space
and reading each side as a length took the two-length and one-length forms
and nothing else, so every keyword the grammar allows was refused. The
[bg-position-] bracket reads the same CSS type through the same reader; the
two families must not disagree about what a position is. *)letparse_object_positionraw:Css.position_valueoption=letcursor=Cascade.Cursor.of_string(Parse.decode_arbitrary_valueraw)inmatchCascade.Cursor.try_parse_full_errCss.Properties.read_position_valuecursorwith|Okpos->Somepos|Error_->NonemoduleHandler=structopenStyleopenCsstypet=|(* Display *)Block|Inline|Inline_block|Inline_table|Table|Table_caption|Table_cell|Table_column|Table_column_group|Table_footer_group|Table_header_group|Table_row|Table_row_group|List_item|Flow_root|Contents|Hidden|(* Visibility *)Visible|Invisible|Collapse|(* Isolation *)Isolate|Isolation_auto|(* Z-index *)Z_0|Z_10|Z_20|Z_30|Z_40|Z_50|Z_auto|Zofint(* Dynamic z-index: z-5, z-100, etc. *)|Neg_zofint(* Negative z-index: -z-10, -z-50, etc. *)(* Arbitrary values (z-[123]). The author's bracket text travels with what
it denotes, so the class name is spelled exactly as it was written. The
bracket carries either a value the z-index grammar reads or, when it does
not, that text verbatim: Tailwind hands a bracket to the declaration
unvalidated. *)|Z_arbitraryofstring*[`IndexofCss.z_index|`Rawofstring]|Neg_z_arbitraryofstring*Css.z_index(* Negative arbitrary: -z-[var(--value)] *)|(* Object fit *)Object_contain|Object_cover|Object_fill|Object_none|Object_scale_down|(* Object position *)Object_center|Object_top|Object_bottom|Object_left|Object_right|Object_bottom_left|Object_bottom_right|Object_left_bottom|Object_left_top|Object_right_bottom|Object_right_top|Object_top_left|Object_top_right|Object_arbitraryofstring|Object_rawofstring*string(* object-[foo]: the family writes one longhand, so a bracket no reader
took still names it and the value is forwarded verbatim. *)|(* Float *)Float_left|Float_right|Float_none|Float_start|Float_end|(* Clear *)Clear_left|Clear_right|Clear_none|Clear_both|Clear_start|Clear_end|(* Box decoration break *)Box_decoration_clone|Box_decoration_slice|Decoration_clone(* legacy alias, keeps its class name *)|Decoration_slice|(* Break before/after/inside - page/column breaks *)Break_before_all|Break_before_auto|Break_before_avoid|Break_before_avoid_page|Break_before_column|Break_before_left|Break_before_page|Break_before_right|Break_after_all|Break_after_auto|Break_after_avoid|Break_after_avoid_page|Break_after_column|Break_after_left|Break_after_page|Break_after_right|Break_inside_auto|Break_inside_avoid|Break_inside_avoid_column|Break_inside_avoid_pageletname="layout"(* Most layout utilities are the display family (priority 4). Visibility,
z-index, break controls, box decoration, and object controls occupy their
own property bands. *)letpriority=function|Collapse|Invisible|Visible->0|Neg_z_|Z_0|Z_|Z_10|Z_20|Z_30|Z_40|Z_50|Neg_z_arbitrary_|Z_arbitrary_|Z_auto->0(* isolation (rank 11) sits between inset and z-index. *)|Isolate|Isolation_auto->0(* float and clear (ranks 21-22) sit between the grid-column/grid-row group
and .container, both at priority 1. *)|Float_end|Float_left|Float_none|Float_right|Float_start|Clear_both|Clear_end|Clear_left|Clear_none|Clear_right|Clear_start->1(* object-fit / object-position (rank ~72): after svg fill/stroke, which
shares this priority, and before padding (23). *)|Object_contain|Object_cover|Object_fill|Object_none|Object_scale_down|Object_center|Object_top|Object_bottom|Object_left|Object_right|Object_bottom_left|Object_bottom_right|Object_left_bottom|Object_left_top|Object_right_bottom|Object_right_top|Object_top_left|Object_top_right|Object_arbitrary_|Object_raw_->22|Break_before_all|Break_before_auto|Break_before_avoid|Break_before_avoid_page|Break_before_column|Break_before_left|Break_before_page|Break_before_right|Break_inside_auto|Break_inside_avoid|Break_inside_avoid_column|Break_inside_avoid_page|Break_after_all|Break_after_auto|Break_after_avoid|Break_after_avoid_page|Break_after_column|Break_after_left|Break_after_page|Break_after_right->14|Box_decoration_clone|Box_decoration_slice|Decoration_clone|Decoration_slice->21|_->4letsuborder=function(* Display utilities - ordered alphabetically per Tailwind. Gaps left for
flex(3), grid(5), inline-flex(9), inline-grid(10) which live in flex.ml
and grid.ml with the same priority. *)|Block->1|Contents->2(* flex = 3, in flex.ml *)|Flow_root->4(* grid = 5, in grid.ml *)|Hidden->6|Inline->7|Inline_block->8(* inline-flex = 9, in flex.ml *)(* inline-grid = 10, in grid.ml *)|Inline_table->11|List_item->12|Table->13|Table_caption->15|Table_cell->16|Table_column->17|Table_column_group->18|Table_footer_group->20|Table_header_group->21|Table_row->22|Table_row_group->23(* Visibility (priority 0) - first in Tailwind's order, before sr-only
(suborder -2). Alphabetical: collapse, invisible, visible. *)|Collapse->-20|Invisible->-19|Visible->-18(* Isolation (priority 0) - after inset (up to ~13M in position.ml), before
z-index (20M). Order: isolate, isolation-auto *)|Isolate->15_000_000|Isolation_auto->15_000_001(* Z-index (priority 0) - after inset (up to ~13M in position.ml), before
container (priority 1). Order: negative, positive, arbitrary, auto. *)|Neg_zn->20_000_000+500+n(* -z-50, -z-10 *)|Z_0->20_000_000+600|Zn->20_000_000+601+n(* z-10 *)|Z_10->20_000_000+611|Z_20->20_000_000+621|Z_30->20_000_000+631|Z_40->20_000_000+641|Z_50->20_000_000+651|Neg_z_arbitrary_->20_000_000+560|Z_arbitrary_->20_000_000+700|Z_auto->20_000_000+750(* Object fit, after every fill and stroke: svg.ml shares this priority and
Tailwind emits it first of the two, so the whole family starts past what
that handler assigns. *)|Object_contain->Svg.suborder_ceiling+600|Object_cover->Svg.suborder_ceiling+601|Object_fill->Svg.suborder_ceiling+602|Object_none->Svg.suborder_ceiling+603|Object_scale_down->Svg.suborder_ceiling+604(* Object position - alphabetical: bottom, bottom-left, ..., top-right *)|Object_bottom->Svg.suborder_ceiling+700|Object_bottom_left->Svg.suborder_ceiling+701|Object_bottom_right->Svg.suborder_ceiling+702|Object_center->Svg.suborder_ceiling+703|Object_left->Svg.suborder_ceiling+704|Object_left_bottom->Svg.suborder_ceiling+705|Object_left_top->Svg.suborder_ceiling+706|Object_right->Svg.suborder_ceiling+707|Object_right_bottom->Svg.suborder_ceiling+708|Object_right_top->Svg.suborder_ceiling+709|Object_top->Svg.suborder_ceiling+710|Object_top_left->Svg.suborder_ceiling+711|Object_top_right->Svg.suborder_ceiling+712|Object_arbitrary_|Object_raw_->Svg.suborder_ceiling+650(* Float (priority 1) - after the grid-column/grid-row group (up to ~2.6K in
grid_item.ml), before .container (9M). Alphabetical: end, left, none,
right, start *)|Float_end->3_000_000|Float_left->3_000_001|Float_none->3_000_002|Float_right->3_000_003|Float_start->3_000_004(* Clear (priority 1) - right after float. Alphabetical: both, end, left,
none, right, start *)|Clear_both->3_000_100|Clear_end->3_000_101|Clear_left->3_000_102|Clear_none->3_000_103|Clear_right->3_000_104|Clear_start->3_000_105(* Box decoration break (priority 21) sits after mask-image and its gradient
variables, before background-size. *)|Box_decoration_clone->Utility.Property_order.last250|Box_decoration_slice->Utility.Property_order.last250|Decoration_clone->Utility.Property_order.last250|Decoration_slice->Utility.Property_order.last250(* Break before - alphabetical order (Tailwind: break-before < break-inside
< break-after) *)|Break_before_all->1100|Break_before_auto->1101|Break_before_avoid->1102|Break_before_avoid_page->1103|Break_before_column->1104|Break_before_left->1105|Break_before_page->1106|Break_before_right->1107(* Break inside - alphabetical order *)|Break_inside_auto->1200|Break_inside_avoid->1201|Break_inside_avoid_column->1202|Break_inside_avoid_page->1203(* Break after - alphabetical order *)|Break_after_all->1300|Break_after_auto->1301|Break_after_avoid->1302|Break_after_avoid_page->1303|Break_after_column->1304|Break_after_left->1305|Break_after_page->1306|Break_after_right->1307(** {1 Style Generation} *)letto_class=function|Block->"block"|Inline->"inline"|Inline_block->"inline-block"|Inline_table->"inline-table"|Table->"table"|Table_caption->"table-caption"|Table_cell->"table-cell"|Table_column->"table-column"|Table_column_group->"table-column-group"|Table_footer_group->"table-footer-group"|Table_header_group->"table-header-group"|Table_row->"table-row"|Table_row_group->"table-row-group"|List_item->"list-item"|Flow_root->"flow-root"|Contents->"contents"|Hidden->"hidden"|Visible->"visible"|Invisible->"invisible"|Collapse->"collapse"|Isolate->"isolate"|Isolation_auto->"isolation-auto"|Z_0->"z-0"|Zn->"z-"^string_of_intn|Z_10->"z-10"|Z_20->"z-20"|Z_30->"z-30"|Z_40->"z-40"|Z_50->"z-50"|Z_auto->"z-auto"|Neg_zn->"-z-"^string_of_intn|Z_arbitrary(s,_)->"z-["^s^"]"|Neg_z_arbitrary(s,_)->"-z-["^s^"]"|Object_contain->"object-contain"|Object_cover->"object-cover"|Object_fill->"object-fill"|Object_none->"object-none"|Object_scale_down->"object-scale-down"|Object_center->"object-center"|Object_top->"object-top"|Object_bottom->"object-bottom"|Object_left->"object-left"|Object_right->"object-right"|Object_bottom_left->"object-bottom-left"|Object_bottom_right->"object-bottom-right"|Object_left_bottom->"object-left-bottom"|Object_left_top->"object-left-top"|Object_right_bottom->"object-right-bottom"|Object_right_top->"object-right-top"|Object_top_left->"object-top-left"|Object_top_right->"object-top-right"|Object_arbitrarys|Object_raw(s,_)->"object-["^s^"]"|Float_left->"float-left"|Float_right->"float-right"|Float_none->"float-none"|Float_start->"float-start"|Float_end->"float-end"|Clear_left->"clear-left"|Clear_right->"clear-right"|Clear_none->"clear-none"|Clear_both->"clear-both"|Clear_start->"clear-start"|Clear_end->"clear-end"|Box_decoration_clone->"box-decoration-clone"|Box_decoration_slice->"box-decoration-slice"|Decoration_clone->"decoration-clone"|Decoration_slice->"decoration-slice"|Break_before_all->"break-before-all"|Break_before_auto->"break-before-auto"|Break_before_avoid->"break-before-avoid"|Break_before_avoid_page->"break-before-avoid-page"|Break_before_column->"break-before-column"|Break_before_left->"break-before-left"|Break_before_page->"break-before-page"|Break_before_right->"break-before-right"|Break_after_all->"break-after-all"|Break_after_auto->"break-after-auto"|Break_after_avoid->"break-after-avoid"|Break_after_avoid_page->"break-after-avoid-page"|Break_after_column->"break-after-column"|Break_after_left->"break-after-left"|Break_after_page->"break-after-page"|Break_after_right->"break-after-right"|Break_inside_auto->"break-inside-auto"|Break_inside_avoid->"break-inside-avoid"|Break_inside_avoid_column->"break-inside-avoid-column"|Break_inside_avoid_page->"break-inside-avoid-page"(* An [object-<position>] class reads its keyword off
[--object-position-<pos>] when the theme binds one. The token name and the
keyword travel together with the constructor that names them, so there is
no second list of positions to keep in step with the first. *)letobject_position_stylethemepos(default:Css.position_value)=letname="object-position-"^posinmatchScheme.theme_value(Sometheme)namewith|Somevalue->lettheme_decl=Css.custom_property~layer:"theme"("--"^name)valueinletpos_ref:Css.position_valueCss.var=Var.bracketnameinstyle[theme_decl;object_position(Varpos_ref)](* Without a theme override Tailwind writes the keyword, not a reference to
a token nothing declares. *)|None->style[object_positiondefault]letto_styletheme=letz_auto_style()=z_auto_style~theme()infunction|Block->style[displayBlock]|Inline->style[displayInline]|Inline_block->style[displayInline_block]|Inline_table->style[displayInline_table]|Table->style[displayTable]|Table_caption->style[displayTable_caption]|Table_cell->style[displayTable_cell]|Table_column->style[displayTable_column]|Table_column_group->style[displayTable_column_group]|Table_footer_group->style[displayTable_footer_group]|Table_header_group->style[displayTable_header_group]|Table_row->style[displayTable_row]|Table_row_group->style[displayTable_row_group]|List_item->style[displayList_item]|Flow_root->style[displayFlow_root]|Contents->style[displayContents]|Hidden->style[displayNone]|Visible->style[visibilityVisible]|Invisible->style[visibilityHidden]|Collapse->style[visibilityCollapse]|Isolate->style[isolationIsolate]|Isolation_auto->style[isolationAuto]|Z_0->style[z_index(Index0)]|Zn->style[z_index(Indexn)]|Z_10->style[z_index(Index10)]|Z_20->style[z_index(Index20)]|Z_30->style[z_index(Index30)]|Z_40->style[z_index(Index40)]|Z_50->style[z_index(Index50)]|Z_auto->z_auto_style()|Neg_zn->style[z_index(Index(-n))]|Z_arbitrary(_,`Indexzi)->style[z_indexzi]|Z_arbitrary(_,`Rawv)->(matchParse.opaque_declaration"z-index"vwith|Somedeclaration->style[declaration]|None->style[])|Neg_z_arbitrary(_,zi)->style[z_index(Calc(Css.Calc.mul(Valzi)(Css.Calc.float(-1.))))]|Object_contain->style[object_fitContain]|Object_cover->style[object_fitCover]|Object_fill->style[object_fitFill]|Object_none->style[object_fitNone]|Object_scale_down->style[object_fitScale_down]|Object_center->object_position_styletheme"center"Center|Object_top->object_position_styletheme"top"Top|Object_bottom->object_position_styletheme"bottom"Bottom|Object_left->object_position_styletheme"left"Left|Object_right->object_position_styletheme"right"Right|Object_bottom_left->object_position_styletheme"bottom-left"Bottom_left|Object_bottom_right->object_position_styletheme"bottom-right"Bottom_right|Object_left_bottom->object_position_styletheme"left-bottom"Left_bottom|Object_left_top->object_position_styletheme"left-top"Left_top|Object_right_bottom->object_position_styletheme"right-bottom"Right_bottom|Object_right_top->object_position_styletheme"right-top"Right_top|Object_top_left->object_position_styletheme"top-left"Top_left|Object_top_right->object_position_styletheme"top-right"Top_right|Object_raw(_,v)->style(Option.to_list(Parse.opaque_declaration"object-position"v))|Object_arbitrarybracket->((* Only a var() reference names a variable; anything else is a position
value, which [object-[50%]] used to turn into [var(--50)]. [of_class]
refused an empty hint, so the peel succeeds here. *)letraw=Option.value(Parse.value_after_hintbracket)~default:bracketinmatchparse_object_positionrawwith|Somepos->style[object_positionpos]|None->letbare_name=Parse.extract_var_namerawinletpos_ref:Css.position_valueCss.var=Var.bracketbare_nameinstyle[object_position(Varpos_ref)])|Float_left->style[Css.floatLeft]|Float_right->style[Css.floatRight]|Float_none->style[Css.floatNone]|Float_start->style[Css.floatInline_start]|Float_end->style[Css.floatInline_end]|Clear_left->style[Css.clearLeft]|Clear_right->style[Css.clearRight]|Clear_none->style[Css.clearNone]|Clear_both->style[Css.clearBoth]|Clear_start->style[Css.clearInline_start]|Clear_end->style[Css.clearInline_end]|Box_decoration_clone->style[Css.webkit_box_decoration_breakClone;Css.box_decoration_breakClone;]|Box_decoration_slice->style[Css.webkit_box_decoration_breakSlice;Css.box_decoration_breakSlice;]|Decoration_clone->style[Css.webkit_box_decoration_breakClone;Css.box_decoration_breakClone;]|Decoration_slice->style[Css.webkit_box_decoration_breakSlice;Css.box_decoration_breakSlice;](* Break before *)|Break_before_all->style[Css.break_beforeAll]|Break_before_auto->style[Css.break_beforeAuto]|Break_before_avoid->style[Css.break_beforeAvoid]|Break_before_avoid_page->style[Css.break_beforeAvoid_page]|Break_before_column->style[Css.break_beforeColumn]|Break_before_left->style[Css.break_beforeLeft]|Break_before_page->style[Css.break_beforePage]|Break_before_right->style[Css.break_beforeRight](* Break after *)|Break_after_all->style[Css.break_afterAll]|Break_after_auto->style[Css.break_afterAuto]|Break_after_avoid->style[Css.break_afterAvoid]|Break_after_avoid_page->style[Css.break_afterAvoid_page]|Break_after_column->style[Css.break_afterColumn]|Break_after_left->style[Css.break_afterLeft]|Break_after_page->style[Css.break_afterPage]|Break_after_right->style[Css.break_afterRight](* Break inside *)|Break_inside_auto->style[Css.break_insideAuto]|Break_inside_avoid->style[Css.break_insideAvoid]|Break_inside_avoid_column->style[Css.break_insideAvoid_column]|Break_inside_avoid_page->style[Css.break_insideAvoid_page](** {1 Parsing Functions} *)(* The z-index a [z-[...]] bracket denotes. [None] is a bracket the z-index
grammar cannot read, and [of_class] refuses the utility rather than leaving
[to_style] to raise. *)letarbitrary_z_indexinner:Css.z_indexoption=letcursor=Cascade.Cursor.of_string(Parse.decode_arbitrary_valueinner)inmatchCascade.Cursor.try_parse_full_errCss.Properties.read_z_indexcursorwith|Okzi->Somezi|Error_->Noneletof_class_themeclass_name=letparts=Parse.split_classclass_nameinmatchpartswith|["block"]->OkBlock|["contents"]->OkContents|["flow";"root"]->OkFlow_root|["inline"]->OkInline|["inline";"block"]->OkInline_block|["inline";"table"]->OkInline_table|["list";"item"]->OkList_item|["table"]->OkTable|["table";"caption"]->OkTable_caption|["table";"cell"]->OkTable_cell|["table";"column"]->OkTable_column|["table";"column";"group"]->OkTable_column_group|["table";"footer";"group"]->OkTable_footer_group|["table";"header";"group"]->OkTable_header_group|["table";"row"]->OkTable_row|["table";"row";"group"]->OkTable_row_group|["hidden"]->OkHidden|["visible"]->OkVisible|["invisible"]->OkInvisible|["collapse"]->OkCollapse|["isolate"]->OkIsolate|["isolation";"auto"]->OkIsolation_auto|["z";"0"]->OkZ_0|["z";"10"]->OkZ_10|["z";"20"]->OkZ_20|["z";"30"]->OkZ_30|["z";"40"]->OkZ_40|["z";"50"]->OkZ_50|["z";"auto"]->OkZ_auto|["z";n]whenString.starts_with~prefix:"["n->(* Arbitrary value: z-[123] *)ifParse.is_bracket_valuenthenletinner=Parse.bracket_innerninmatcharbitrary_z_indexinnerwith|Somezi->Ok(Z_arbitrary(inner,`Indexzi))|None->((* Not a z-index, so it goes to the declaration as written. *)matchParse.arbitrary_declaration_valueinnerwith|Somev->Ok(Z_arbitrary(inner,`Rawv))|None->Error(`Msg("Invalid z-index arbitrary value: "^n)))elseError(`Msg("Invalid z-index arbitrary value: "^n))|["z";n]->((* Dynamic z-index: z-5, z-100, etc. *)matchParse.decimal_intnwith|Somei->Ok(Zi)|None->Error(`Msg("Invalid z-index value: "^n)))|""::"z"::restwhenrest<>[]->((* Negative z-index: -z-10, -z-50, -z-[var(--value)], etc. *)letvalue=String.concat"-"restinifParse.is_bracket_valuevaluethenletinner=Parse.bracket_innervalueinmatcharbitrary_z_indexinnerwith|Somezi->Ok(Neg_z_arbitrary(inner,zi))|None->Error(`Msg("Invalid negative z-index value: "^value))elsematchParse.decimal_intvaluewith|Somei->Ok(Neg_zi)|None->Error(`Msg("Invalid negative z-index value: "^value)))|["object";"contain"]->OkObject_contain|["object";"cover"]->OkObject_cover|["object";"fill"]->OkObject_fill|["object";"none"]->OkObject_none|["object";"scale";"down"]->OkObject_scale_down|["object";"center"]->OkObject_center|["object";"top"]->OkObject_top|["object";"bottom"]->OkObject_bottom|["object";"left"]->OkObject_left|["object";"right"]->OkObject_right|["object";"bottom";"left"]->OkObject_bottom_left|["object";"bottom";"right"]->OkObject_bottom_right|["object";"left";"bottom"]->OkObject_left_bottom|["object";"left";"top"]->OkObject_left_top|["object";"right";"bottom"]->OkObject_right_bottom|["object";"right";"top"]->OkObject_right_top|["object";"top";"left"]->OkObject_top_left|["object";"top";"right"]->OkObject_top_right|["object";value]whenParse.is_bracket_valuevalue->(letinner=Parse.bracket_innervaluein(* Only a var() reference names a variable; anything the position parser
rejects is not a utility. A data-type hint chooses which longhand a
bracket lands in and says nothing about the value, and this family
writes one, so the reader is handed what follows it. The constructor
keeps the bracket whole, because the class name is what the markup
carries. *)letreadablev=parse_object_positionv<>None||Parse.is_varvinifOption.fold~none:false~some:readable(Parse.value_after_hintinner)thenOk(Object_arbitraryinner)elsematchParse.arbitrary_declaration_valueinnerwith|Someraw->Ok(Object_raw(inner,raw))|None->Error(`Msg("Invalid object-position value: "^inner)))|["float";"left"]->OkFloat_left|["float";"right"]->OkFloat_right|["float";"none"]->OkFloat_none|["float";"start"]->OkFloat_start|["float";"end"]->OkFloat_end|["clear";"left"]->OkClear_left|["clear";"right"]->OkClear_right|["clear";"none"]->OkClear_none|["clear";"both"]->OkClear_both|["clear";"start"]->OkClear_start|["clear";"end"]->OkClear_end|["box";"decoration";"clone"]->OkBox_decoration_clone|["box";"decoration";"slice"]->OkBox_decoration_slice|["decoration";"clone"]->OkDecoration_clone|["decoration";"slice"]->OkDecoration_slice(* Break before *)|["break";"before";"all"]->OkBreak_before_all|["break";"before";"auto"]->OkBreak_before_auto|["break";"before";"avoid"]->OkBreak_before_avoid|["break";"before";"avoid";"page"]->OkBreak_before_avoid_page|["break";"before";"column"]->OkBreak_before_column|["break";"before";"left"]->OkBreak_before_left|["break";"before";"page"]->OkBreak_before_page|["break";"before";"right"]->OkBreak_before_right(* Break after *)|["break";"after";"all"]->OkBreak_after_all|["break";"after";"auto"]->OkBreak_after_auto|["break";"after";"avoid"]->OkBreak_after_avoid|["break";"after";"avoid";"page"]->OkBreak_after_avoid_page|["break";"after";"column"]->OkBreak_after_column|["break";"after";"left"]->OkBreak_after_left|["break";"after";"page"]->OkBreak_after_page|["break";"after";"right"]->OkBreak_after_right(* Break inside *)|["break";"inside";"auto"]->OkBreak_inside_auto|["break";"inside";"avoid"]->OkBreak_inside_avoid|["break";"inside";"avoid";"column"]->OkBreak_inside_avoid_column|["break";"inside";"avoid";"page"]->OkBreak_inside_avoid_page|_->Error(`Msg"Not a layout utility")letexamples=[Block;Visible;Z_auto;Isolate;Float_left;Clear_both;Object_contain;Object_center;Break_before_page;Break_after_page;Break_inside_avoid;]endopenHandlermoduleScreen_reader_utility=Utility.Make(Screen_reader_handler)moduleUtility_factory=Utility.Make(Handler)(** {1 Public API - Utility Values} *)(* Layout utilities *)letutility=Utility_factory.vletblock=utilityBlockletcontents=utilityContentsletflow_root=utilityFlow_rootletinline=utilityInlineletinline_block=utilityInline_blockletinline_table=utilityInline_tableletlist_item=utilityList_itemlettable=utilityTablelettable_caption=utilityTable_captionlettable_cell=utilityTable_celllettable_column=utilityTable_columnlettable_column_group=utilityTable_column_grouplettable_footer_group=utilityTable_footer_grouplettable_header_group=utilityTable_header_grouplettable_row=utilityTable_rowlettable_row_group=utilityTable_row_grouplethidden=utilityHiddenletvisible=utilityVisibleletinvisible=utilityInvisibleletcollapse=utilityCollapseletisolate=utilityIsolateletisolation_auto=utilityIsolation_autoletz_0=utilityZ_0letz_10=utilityZ_10letz_20=utilityZ_20letz_30=utilityZ_30letz_40=utilityZ_40letz_50=utilityZ_50letzn=utility(Zn)letz_auto=utilityZ_autoletobject_contain=utilityObject_containletobject_cover=utilityObject_coverletobject_fill=utilityObject_fillletobject_none=utilityObject_noneletobject_scale_down=utilityObject_scale_downletobject_center=utilityObject_centerletobject_top=utilityObject_topletobject_bottom=utilityObject_bottomletobject_left=utilityObject_leftletobject_right=utilityObject_rightletobject_bottom_left=utilityObject_bottom_leftletobject_bottom_right=utilityObject_bottom_rightletobject_left_bottom=utilityObject_left_bottomletobject_left_top=utilityObject_left_topletobject_right_bottom=utilityObject_right_bottomletobject_right_top=utilityObject_right_topletobject_top_left=utilityObject_top_leftletobject_top_right=utilityObject_top_rightletfloat_left=utilityFloat_leftletfloat_right=utilityFloat_rightletfloat_none=utilityFloat_noneletfloat_start=utilityFloat_startletfloat_end=utilityFloat_endletclear_left=utilityClear_leftletclear_right=utilityClear_rightletclear_none=utilityClear_noneletclear_both=utilityClear_bothletclear_start=utilityClear_startletclear_end=utilityClear_end(* Screen reader utilities *)letsr_utility=Screen_reader_utility.vletsr_only=sr_utilityScreen_reader_handler.Sr_onlyletnot_sr_only=sr_utilityScreen_reader_handler.Not_sr_only(* Box decoration break utilities *)letbox_decoration_clone=utilityBox_decoration_cloneletbox_decoration_slice=utilityBox_decoration_slice(* Break before/after/inside utilities - page/column breaks *)letbreak_before_all=utilityBreak_before_allletbreak_before_auto=utilityBreak_before_autoletbreak_before_avoid=utilityBreak_before_avoidletbreak_before_avoid_page=utilityBreak_before_avoid_pageletbreak_before_column=utilityBreak_before_columnletbreak_before_left=utilityBreak_before_leftletbreak_before_page=utilityBreak_before_pageletbreak_before_right=utilityBreak_before_rightletbreak_after_all=utilityBreak_after_allletbreak_after_auto=utilityBreak_after_autoletbreak_after_avoid=utilityBreak_after_avoidletbreak_after_avoid_page=utilityBreak_after_avoid_pageletbreak_after_column=utilityBreak_after_columnletbreak_after_left=utilityBreak_after_leftletbreak_after_page=utilityBreak_after_pageletbreak_after_right=utilityBreak_after_rightletbreak_inside_auto=utilityBreak_inside_autoletbreak_inside_avoid=utilityBreak_inside_avoidletbreak_inside_avoid_column=utilityBreak_inside_avoid_columnletbreak_inside_avoid_page=utilityBreak_inside_avoid_page