123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233(*********************************************************************************)(* OCaml-CSS *)(* *)(* Copyright (C) 2023-2024 INRIA All rights reserved. *)(* Author: Maxence Guesdon, INRIA Saclay *)(* *)(* This program is free software; you can redistribute it and/or modify *)(* it under the terms of the GNU General Public License as *)(* published by the Free Software Foundation, version 3 of the License. *)(* *)(* This program is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU General Public License for more details. *)(* *)(* You should have received a copy of the GNU General Public *)(* License along with this program; if not, write to the Free Software *)(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *)(* 02111-1307 USA *)(* *)(* As a special exception, you have permission to link this program *)(* with the OCaml compiler and distribute executables, as long as you *)(* follow the requirements of the GNU GPL in regard to all of the *)(* software in the executable aside from the OCaml compiler. *)(* *)(* Contact: Maxence.Guesdon@inria.fr *)(* *)(*********************************************************************************)(** Types and base definitions. *)(** {2 Utils} *)(** Maps of strings. *)moduleSmap=Map.Make(String)(** String sets. *)moduleSset=Set.Make(String)(** Maps over integers. *)moduleImap=Map.Make(Int)(** [mk_pp f] creates a [formatter -> x -> unit] function from
the given [x -> string] function. *)letmk_ppf=funppfx->Format.pp_print_stringppf(fx)(** [string_of_list sep to_string l] is [String.concat sep (List.map to_string l)].*)letstring_of_listsepto_stringl=String.concatsep(List.mapto_stringl)(** [mk_of_string to_string l] returns a function mapping strings to values,
according to the reverse function [to_string].
Optional argument [case_sensitive] (default is [true]) indicates where
case is taken into account when mapping from string to values.
The returned function returns [None] if the given string could not
be mapped to a value, else [Some value].
*)letmk_of_string?(case_sensitive=true)to_stringl=letf=ifcase_sensitivethenfunx->xelseString.lowercase_asciiinletl=List.map(funx->(f(to_stringx),x))linfunstr->letstr=ifnotcase_sensitivethenfstrelsestrinList.assoc_optstrl(** {2 Positions and locations} *)typepos=Lexing.positiontypeloc=pos*postype'awith_loc='a*loctype'awith_loc_option='a*locoptionletdummy_loc=Lexing.dummy_pos,Lexing.dummy_posletstring_of_loc(loc_start,loc_end)=Rdf.Loc.(string_of_loc{loc_start;loc_end})letstring_of_loc_option=function|None->""|Someloc->string_of_loclocletpp_locppf(loc_start,loc_end)=Rdf.Loc.(ppppf{loc_start;loc_end})letpp_loc_optionppf=function|None->()|Someloc->pp_locppfloc(** [pos_of_string_at str at] returns the {!type-pos} corresponding
to offset [at] in the given string.
Optional arguments:
{ul
{- [fname] specifies a filename to use in the returned position.}
{- [from], as a pair [(offset, p)], specifies to start at
[offset], using [p] as initial {!type-pos} structure. The [fname]
in returned position still is the optiona [fname] argument.}
}
*)letpos_of_string_at=letreciterstrlenat(l,bol,c)i=ifi>=len||i=atthen(l,bol,c)elsematchString.getstriwith|'\n'->iterstrlenat(l+1,i,c+1)(i+1)|_->iterstrlenat(l,bol,c+1)(i+1)infun?(fname="")?fromstrat->letlen=String.lengthstrinlet(start,i)=matchfromwith|None->(1,0,0),0|Some(n,p)->(p.Lexing.pos_lnum,p.pos_bol,p.pos_cnum),ninlet(pos_lnum,pos_bol,pos_cnum)=iterstrlenatstartiinLexing.{pos_fname=fname;pos_lnum;pos_bol;pos_cnum}letloc_of_string_atstri=letpos=pos_of_string_atstriin(pos,pos)(** {2 Parsing contexts} *)(** A context is used in parsers to retrieve location information.
[get_pos] returns the current position. [last_pos] returns the
most advanced position seen. [string_of_loc] returns the string
corresponding to the given location.
*)typectx={get_pos:posAngstrom.t;last_pos:posAngstrom.t;string_of_loc:loc->string;}(** [ctx get_pos] builds a new context with the given [get_pos]
functions. *)letctxget_pos=letopenAngstrominletlast_pos_=refNoneinletget_pos=pos>>|funn->letp=get_posninlet()=match!last_pos_with|Some(n0,_)whenn0<n->last_pos_:=Some(n,p)|None->last_pos_:=Some(n,p)|_->()inpinletlast_pos=get_pos>>|fun_->match!last_pos_with|None->assertfalse|Some(n,p)->pin{get_pos=get_pos;string_of_loc=string_of_loc;last_pos;}(** [string_ctx str] creates a context from the given string [str].
Computing of {!type-pos} structure is cached.
[fname] can be specified to set this field in positions.
*)letstring_ctx?fnamestr=letget_pos=letmap=refImap.emptyinfunn->matchImap.find_optn!mapwith|Somepos->pos|None->matchImap.find_last_opt(funp->p<=n)!mapwith|Some(p,pos)whenn=p->pos|from->letp=pos_of_string_at?fname?fromstrninmap:=Imap.addnp!map;pinctxget_pos(** {2 Error handling} *)(** Parsing errors. *)typeparse_error=|Unterminated_string|Unterminated_comment|Unterminated_char_escape|Invalid_iriofstring*Iri.error|Otherofstringtypeerror=|Parse_errorofposoption*parse_error|Undefined_namespaceofstring*locexceptionErroroferrorletstring_of_parse_error=function|Unterminated_string->"Unterminated string"|Unterminated_comment->"Unterminated comment"|Unterminated_char_escape->"Unterminated char escape"|Invalid_iri(s,e)->Printf.sprintf"Invalid iri %S: %s"s(Iri.string_of_errore)|Others->sletstring_of_error?(to_loc=string_of_loc)=function|Parse_error(None,e)->string_of_parse_errore|Parse_error(Somepos,e)->Printf.sprintf"%s%s"(to_loc(pos,pos))(string_of_parse_errore)|Undefined_namespace(ns,loc)->Printf.sprintf"%sundefined namespace %S"(to_locloc)nsletpp_error=mk_ppstring_of_errorlet()=Printexc.register_printer(functionErrore->Some(string_of_error?to_loc:Nonee)|_->None)leterrore=raise(Errore)(** {2 Global keywords} *)typeglobal_kw=[`Inherit|`Initial|`Revert|`Revert_layer|`Unset]letglobal_kws=[`Inherit;`Initial;`Revert;`Revert_layer;`Unset](** A ['a p_value] is either a global keyword,
a variable ([`Var (name, optional string value)]) or a value ([`V 'a]).
We do not know at variable definition time in which property this
variable will be used. The parser associated to a property will
parse the optional default variable value when the variable is expanded.
*)type'ap_value=[global_kw|`Varofstring*stringoption|`Vof'a]letstring_of_p_value:('a->string)->'ap_value->string=funto_s->function|(#global_kwasx)->Kw.string_of_kwx|`Var(id,None)->Printf.sprintf"var(%s)"id|`Var(id,Somes)->Printf.sprintf"var(%s, %s)"ids|`Vx->to_sxletpp_p_value:(Format.formatter->'a->unit)->Format.formatter->'ap_value->unit=funppfmt->function|(#global_kwasx)->Format.pp_print_stringfmt(Kw.string_of_kwx)|`Var(id,None)->Format.fprintffmt"var(%s)"id|`Var(id,Somes)->Format.fprintffmt"var(%s, %s)"ids|`Vx->ppfmtx(** Parsed strings, with a [quoted] flag indicating whether string is quoted. *)typestr={s:string;quoted:bool}letstring_of_str{s;quoted}=ifquotedthenPrintf.sprintf"%S"s(* FIXME: use own way to escape utF8 strings *)elsesletpp_str=mk_ppstring_of_str(** {2 CSS Value types} *)typeside=[`Bottom|`Left|`Right|`Top]letsides=[`Bottom;`Left;`Right;`Top]letstring_of_side:side->string=function|`Bottom->"bottom"|`Left->"left"|`Right->"right"|`Top->"top"typelcr=[`Left|`Center|`Right]typenumber=floatletstring_of_numberf=Format.asprintf"%g"fletpp_number=mk_ppstring_of_numbertyperel_length_unit=[|`em(** Font size of the element.*)|`ex(** x-height of the element's font. *)|`cap(** Cap height (the nominal height of capital letters) of the element's font. *)|`ch(** Average character advance of a narrow glyph in the element's font, as represented by the "0" (ZERO, U+0030) glyph. *)|`ic(** Average character advance of a full width glyph in the element's font, as represented by the "水" (CJK water ideograph, U+6C34) glyph.*)|`rem(** Font size of the root element. *)|`lh(** Line height of the element. *)|`rlh(** Line height of the root element.*)|`vw(** 1% of viewport's width. *)|`vh(** 1% of viewport's height. *)|`vi(** 1% of viewport's size in the root element's inline axis. *)|`vb(** 1% of viewport's size in the root element's block axis. *)|`vmin(** 1% of viewport's smaller dimension. *)|`vmax(** 1% of viewport's larger dimension. *)|`cqw(** 1% of a query container's width *)|`cqh(** 1% of a query container's height *)|`cqi(** 1% of a query container's inline size *)|`cqb(** 1% of a query container's block size *)|`cqmin(** The smaller value of cqi or cqb *)|`cqmax(** The larger value of cqi or cqb *)]letrel_length_units=[`em;`ex;`cap;`ch;`ic;`rem;`lh;`rlh;`vw;`vh;`vi;`vb;`vmin;`vmax;`cqw;`cqh;`cqi;`cqb;`cqmin;`cqmax;]letstring_of_rel_length_unit:rel_length_unit->string=function|`em->"em"|`ex->"ex"|`cap->"cap"|`ch->"ch"|`ic->"ic"|`rem->"rem"|`lh->"lh"|`rlh->"rlh"|`vw->"vw"|`vh->"vh"|`vi->"vi"|`vb->"vb"|`vmin->"vmin"|`vmax->"vmax"|`cqw->"cqw"|`cqh->"cqh"|`cqi->"cqi"|`cqb->"cqb"|`cqmin->"cqmin"|`cqmax->"cqmax"typeabs_length_unit=[|`cm(** Centimeters 1cm = 96px/2.54 *)|`mm(** Millimeters 1mm = 1/10th of 1cm *)|`q(* Quarter-millimeters 1Q = 1/40th of 1cm *)|`In(** Inches 1in = 2.54cm = 96px *)|`pc(** Picas 1pc = 1/6th of 1in *)|`pt(** Points 1pt = 1/72th of 1in *)|`px(** Pixels 1px = 1/96th of 1in *)]letabs_length_units=[`cm;`mm;`q;`In;`pc;`pt;`px]letstring_of_abs_length_unit:abs_length_unit->string=function|`cm->"cm"|`mm->"mm"|`q->"q"|`In->"in"|`pc->"pc"|`pt->"pt"|`px->"px"typelength_unit=[rel_length_unit|abs_length_unit]letstring_of_length_unit:length_unit->string=function|#rel_length_unitasx->string_of_rel_length_unitx|#abs_length_unitasx->string_of_abs_length_unitxletpp_length_unit=mk_ppstring_of_length_unittypeangle_unit=[|`deg(** Degrees There are 360 degrees in a full circle. *)|`grad(** Gradians There are 400 gradians in a full circle. *)|`rad(** Radians There are 2__pi__ radians in a full circle. *)|`turn(** Turns There is 1 turn in a full circle. *)]letangle_units=[`deg;`grad;`rad;`turn]letstring_of_angle_unit:angle_unit->string=function|`deg->"deg"|`grad->"grad"|`rad->"rad"|`turn->"turn"letpp_angle_unit=mk_ppstring_of_angle_unittypeangle=number*angle_unitletstring_of_angle(n,u)=Printf.sprintf"%s%s"(string_of_numbern)(string_of_angle_unitu)letpp_angle=mk_ppstring_of_angletypetime_unit=[`s|`ms]lettime_units=[`s;`ms]letstring_of_time_unit:time_unit->string=function|`s->"s"|`ms->"ms"letpp_time_unit=mk_ppstring_of_time_unittypefreq_unit=[`hz|`khz]letfreq_units=[`hz;`khz]letstring_of_freq_unit:freq_unit->string=function|`hz->"hz"|`khz->"khz"letpp_freq_unit=mk_ppstring_of_freq_unittypeflex_unit=[`fr]letflex_units=[`fr]letstring_of_flex_unit:flex_unit->string=function|`fr->"fr"letpp_flex_unit=mk_ppstring_of_flex_unittyperesolution_unit=[|`dpi(** Dots per inch. *)|`dpcm(** Dots per centimeter. *)|`dppx|`x(** Dots per px unit. *)]letresolution_units=[`dpi;`dpcm;`dppx;`x]letstring_of_resolution_unit:resolution_unit->string=function|`dpi->"dpi"|`dpcm->"dpcm"|`dppx->"dppx"|`x->"x"letpp_resolution_unit=mk_ppstring_of_resolution_unittypedim_unit=[|length_unit|angle_unit|time_unit|freq_unit|flex_unit|resolution_unit]letstring_of_dim_unit:dim_unit->string=function|#length_unitasx->string_of_length_unitx|#angle_unitasx->string_of_angle_unitx|#time_unitasx->string_of_time_unitx|#freq_unitasx->string_of_freq_unitx|#flex_unitasx->string_of_flex_unitx|#resolution_unitasx->string_of_resolution_unitxletpp_dim_unitppfu=Format.pp_print_stringppf(string_of_dim_unitu)typedimension=number*dim_unitletstring_of_dimensionnu=Printf.sprintf"%s%s"(string_of_numbern)(string_of_dim_unitu)typesystem_color=[|`AccentColorText|`ActiveText|`ButtonBorder|`ButtonFace|`ButtonText|`Canvas|`CanvasText|`Field|`FieldText|`GrayText|`Highlight|`HighlightText|`LinkText|`Mark|`MarkText|`SelectedItem|`SelectedItemText|`VisitedText]letsystem_colors=[`AccentColorText;`ActiveText;`ButtonBorder;`ButtonFace;`ButtonText;`Canvas;`CanvasText;`Field;`FieldText;`GrayText;`Highlight;`HighlightText;`LinkText;`Mark;`MarkText;`SelectedItem;`SelectedItemText;`VisitedText;]letstring_of_system_color:system_color->string=function|`AccentColorText->"AccentColorText"|`ActiveText->"ActiveText"|`ButtonBorder->"ButtonBorder"|`ButtonFace->"ButtonFace"|`ButtonText->"ButtonText"|`Canvas->"Canvas"|`CanvasText->"CanvasText"|`Field->"Field"|`FieldText->"FieldText"|`GrayText->"GrayText"|`Highlight->"Highlight"|`HighlightText->"HighlightText"|`LinkText->"LinkText"|`Mark->"Mark"|`MarkText->"MarkText"|`SelectedItem->"SelectedItem"|`SelectedItemText->"SelectedItemText"|`VisitedText->"VisitedText"letpp_system_color=mk_ppstring_of_system_colorletsystem_color_of_string=mk_of_string~case_sensitive:falsestring_of_system_colorsystem_colorstypecolor_kw=[`Current_color|`Transparent]letcolor_kws:color_kwlist=[`Current_color;`Transparent]typecolor=[|`Rgbaoffloat*float*float*float(* all between 0. and 1. *)|`Named_colorofstring|`System_colorofsystem_color|color_kw]letstring_of_color:color->string=function|#color_kwasx->Kw.string_of_kwx|`Rgba(r,g,b,a)->letfcn=max0.(min255.(n*.255.))inPrintf.sprintf"rgb(%g %g %g%s)"(fcr)(fcg)(fcb)(ifa<1.thenPrintf.sprintf" / %g"aelse"")|`Named_colors->s|`System_colorsc->string_of_system_colorscletpp_color=mk_ppstring_of_colortypetrblc=[`Top|`Right|`Bottom|`Left|`Center]lettrblc_kws:trblclist=[`Top;`Right;`Bottom;`Left;`Center]letstring_of_trblc:[<trblc]->string=Kw.string_of_kwtypex_position_kw=[`Left|`Center|`Right]letx_position_kws=[`Left;`Center;`Right]letstring_of_x_position_kw(k:x_position_kw)=string_of_trblc(k:>trblc)typey_position_kw=[`Top|`Center|`Bottom]lety_position_kws=[`Top;`Center;`Bottom]letstring_of_y_position_kw(k:y_position_kw)=string_of_trblc(k:>trblc)typepercentage=[`Percentofnumber]letstring_of_percentage:percentage->string=function|`Percentn->Printf.sprintf"%s%%"(string_of_numbern)typelength_percentage=[`Lengthofnumber*length_unit|percentage]letstring_of_lengthn(u:length_unit)=string_of_dimensionn(u:>dim_unit)letpp_lengthppf(n,u)=Format.pp_print_stringppf(string_of_lengthnu)letstring_of_length_percentage:length_percentage->string=function|#percentageasx->string_of_percentagex|`Length(n,u)->string_of_lengthnuletpp_length_percentage=mk_ppstring_of_length_percentagetype'aaxis_pos=|Offsetoflength_percentage|Kwof'a|KOof'a*length_percentageletstring_of_axis_pos=function|Offsetlp->string_of_length_percentagelp|Kwk->string_of_trblck|KO(k,o)->Printf.sprintf"%s %s"(string_of_trblck)(string_of_length_percentageo)typeaxis_position=|Single_kwoftrblc|XYofx_position_kwaxis_pos*y_position_kwaxis_postypex_position=x_position_kwaxis_postypey_position=y_position_kwaxis_posletstring_of_x_position:x_position->string=string_of_axis_posletstring_of_y_position:y_position->string=string_of_axis_posletstring_of_axis_position=function|Single_kwk->string_of_trblck|XY(x,y)->Printf.sprintf"%s %s"(string_of_axis_posx)(string_of_axis_posy)letpp_axis_positionppf(p:axis_position)=Format.pp_print_stringppf(string_of_axis_positionp)letstring_of_p_number=string_of_p_valuestring_of_numbertypesize_kw=[`Auto|`Max_content|`Min_content]letsize_kws:size_kwlist=[`Auto;`Max_content;`Min_content]typesize=[length_percentage|`Fit_contentoflength_percentage|size_kw]letstring_of_size:size->string=function|#length_percentageasx->string_of_length_percentagex|#size_kwasx->Kw.string_of_kwx|`Fit_contentlp->Printf.sprintf"fit-content(%s)"(string_of_length_percentagelp)letpp_size=mk_ppstring_of_sizetypemax_size_kw=[`None|`Max_content|`Min_content]letmax_size_kws:max_size_kwlist=[`None;`Max_content;`Min_content]typemax_size=[length_percentage|`Fit_contentoflength_percentage|max_size_kw]letstring_of_max_size:max_size->string=function|#length_percentageasx->string_of_length_percentagex|#max_size_kwasx->Kw.string_of_kwx|`Fit_contentlp->Printf.sprintf"fit-content(%s)"(string_of_length_percentagelp)letpp_max_size=mk_ppstring_of_max_sizeletstring_of_urliri=Printf.sprintf"url(%s)"(Iri.to_uriiri)letpp_url=mk_ppstring_of_urltypeline_style=[|`None|`Hidden|`Dotted|`Dashed|`Solid|`Double|`Groove|`Ridge|`Inset|`Outset]letline_styles:line_stylelist=[`None;`Hidden;`Dotted;`Dashed;`Solid;`Double;`Groove;`Ridge;`Inset;`Outset]letstring_of_line_style:line_style->string=Kw.string_of_kwletpp_line_style=mk_ppstring_of_line_styletypegradient=[|`Linear|`Repeating_linear|`Radial|`Repeating_radial]letstring_of_gradient:gradient->string=function|`Linear->"linear-gradient"|`Repeating_linear->"repeating-linear-gradient"|`Radial->"radial-gradient"|`Repeating_radial->"repeating-radial-gradient"letpp_gradient=mk_ppstring_of_gradienttypeimage=[|`UrlofIri.t|`Gradientofgradient*string|`Functionofstring*string(* name, args *)]letstring_of_image:image->string=function|`Urliri->string_of_urliri|`Gradient(g,s)->Printf.sprintf"%s(%s)"(string_of_gradientg)s|`Function(f,args)->Printf.sprintf"%s(%s)"fargsletpp_image=mk_ppstring_of_imagetypevalue=|Stringofstr|Integerofint|Numberofnumber|Dimensionofdimension|Percentofnumber|Colorofcolor|Positionofaxis_positionletstring_of_value:value->string=function|Strings->string_of_strs|Integern->string_of_intn|Numberf->string_of_numberf|Dimension(n,dim)->string_of_dimensionndim|Percentn->Printf.sprintf"%s%%"(string_of_numbern)|Colorc->string_of_colorc|Positionp->string_of_axis_positionpletpp_value=mk_ppstring_of_valuetypeaccent_color_kw=[`Auto]letaccent_color_kws:accent_color_kwlist=[`Auto]typeaccent_color=[color|accent_color_kw]letstring_of_accent_color:accent_color->string=function|#colorasx->string_of_colorx|#accent_color_kwasx->Kw.string_of_kwxletpp_accent_color=mk_ppstring_of_accent_colortypebaseline_position_kw=[`Baseline]letbaseline_position_kws:baseline_position_kwlist=[`Baseline]typebaseline_position=[baseline_position_kw|`First_baseline|`Last_baseline]letstring_of_baseline_position:baseline_position->string=function|`First_baseline->"first baseline"|`Last_baseline->"last baseline"|#baseline_position_kwasx->Kw.string_of_kwxletpp_baseline_position=mk_ppstring_of_baseline_positiontypecontent_position_kw=[`Center|`End|`Flex_end|`Flex_start|`Start]letcontent_position_kws=[`Center;`End;`Flex_end;`Flex_start;`Start]typecontent_position=content_position_kwletstring_of_content_position:content_position->string=Kw.string_of_kwletpp_content_position=mk_ppstring_of_content_positiontypecontent_position_lr_kw=[content_position_kw|`Left|`Right]letcontent_position_lr_kws=`Left::`Right::content_position_kwstypecontent_position_lr=content_position_lr_kwletstring_of_content_position_lr:content_position_lr->string=Kw.string_of_kwletpp_content_position_lr=mk_ppstring_of_content_position_lrtypeself_position_kw=[`Self_start|`Self_end|content_position_kw]letself_position_kws=`Self_start::`Self_end::content_position_kwstypeself_position=self_position_kwletstring_of_self_position:self_position->string=function|#content_positionasx->string_of_content_positionx|#self_position_kwasx->Kw.string_of_kwxletpp_self_position=mk_ppstring_of_self_positiontypeself_position_lr_kw=[self_position_kw|`Left|`Right]letself_position_lr_kws=`Left::`Right::self_position_kwstypeself_position_lr=self_position_lr_kwletstring_of_self_position_lr:self_position_lr->string=Kw.string_of_kwletppself_position_lr=mk_ppstring_of_self_position_lrtypecontent_distribution_kw=[`Space_around|`Space_between|`Space_evenly|`Stretch]letcontent_distribution_kws=[`Space_around;`Space_between;`Space_evenly;`Stretch]typecontent_distribution=content_distribution_kwletstring_of_content_distribution:content_distribution->string=Kw.string_of_kwletpp_content_distribution=mk_ppstring_of_content_distributiontypealign_content_kw=[`Normal]letalign_content_kws:align_content_kwlist=[`Normal]typealign_content=[align_content_kw|baseline_position|content_distribution|content_position|`Safe_posofcontent_position|`Unsafe_posofcontent_position]letstring_of_align_content:align_content->string=function|`Safe_posp->Printf.sprintf"safe %s"(string_of_content_positionp)|`Unsafe_posp->Printf.sprintf"unsafe %s"(string_of_content_positionp)|#baseline_positionasx->string_of_baseline_positionx|#content_distributionasx->string_of_content_distributionx|#content_positionasx->string_of_content_positionx|#align_content_kwasx->Kw.string_of_kwxletpp_align_content=mk_ppstring_of_align_contenttypealign_items_kw=[`Normal|`Stretch]letalign_items_kws:align_items_kwlist=[`Normal;`Stretch]typealign_items=[baseline_position|self_position|`Safe_self_posofself_position|`Unsafe_self_posofself_position|align_items_kw]letstring_of_align_items:align_items->string=function|`Safe_self_posp->Printf.sprintf"safe %s"(string_of_self_positionp)|`Unsafe_self_posp->Printf.sprintf"unsafe %s"(string_of_self_positionp)|#self_positionasx->string_of_self_positionx|#baseline_positionasx->string_of_baseline_positionx|#align_items_kwasx->Kw.string_of_kwxletpp_align_items=mk_ppstring_of_align_itemstypealign_self_kw=[`Auto]letalign_self_kws:align_self_kwlist=[`Auto]typealign_self=[align_self_kw|align_items]letstring_of_align_self:align_self->string=function|`Autoasx->Kw.string_of_kwx|#align_itemsasx->string_of_align_itemsxletpp_align_self=mk_ppstring_of_align_selftypeaspect_ratio_kw=[`Auto]letaspect_ratio_kws:aspect_ratio_kwlist=[`Auto]typeaspect_ratio=[|`Ratioofnumber*numberoption|aspect_ratio_kw]letstring_of_aspect_ratio:aspect_ratio->string=function|`Autoasx->Kw.string_of_kwx|`Ratio(n,None)->string_of_numbern|`Ratio(n1,Somen2)->Printf.sprintf"%s / %s"(string_of_numbern1)(string_of_numbern2)letpp_aspect_ratio=mk_ppstring_of_aspect_ratioletstring_of_background_to_string=string_of_list", "to_stringtypebackground_attachment_kw=[`Fixed|`Local|`Scroll]letbackground_attachment_kws:background_attachment_kwlist=[`Fixed;`Local;`Scroll]typebackground_attachment_=background_attachment_kwtypebackground_attachment=background_attachment_listletstring_of_background_attachment:background_attachment->string=string_of_background_Kw.string_of_kwletpp_background_attachment=mk_ppstring_of_background_attachmenttypebackground_clip_kw=[`Border_box|`Content_box|`Padding_box|`Text]letbackground_clip_kws:background_clip_kwlist=[`Border_box;`Content_box;`Padding_box;`Text]typebackground_clip_=background_clip_kwtypebackground_clip=background_clip_listletstring_of_background_clip:background_clip->string=string_of_background_Kw.string_of_kwletpp_background_clip=mk_ppstring_of_background_cliptypebackground_image_kw=[`None]letbackground_image_kws:background_image_kwlist=[`None]typebackground_image_=[`Imageofimage|background_image_kw]letstring_of_background_image_:background_image_->string=function|`Imagei->string_of_imagei|#background_image_kwasx->Kw.string_of_kwxtypebackground_image=background_image_listletstring_of_background_image:background_image->string=string_of_background_string_of_background_image_letpp_background_image=mk_ppstring_of_background_imagetypebackground_origin_kw=[`Border_box|`Content_box|`Padding_box]letbackground_origin_kws:background_origin_kwlist=[`Border_box;`Content_box;`Padding_box]typebackground_origin_=background_origin_kwtypebackground_origin=background_origin_listletstring_of_background_origin:background_origin->string=string_of_background_Kw.string_of_kwletpp_background_origin=mk_ppstring_of_background_origintypebackground_position_x=x_positionlistletstring_of_background_position_x:background_position_x->string=string_of_background_string_of_x_positionletpp_background_position_x=mk_ppstring_of_background_position_xtypebackground_position_y=y_positionlistletstring_of_background_position_y:background_position_y->string=string_of_background_string_of_y_positionletpp_background_position_y=mk_ppstring_of_background_position_ytyperepeat=[`No_repeat|`Repeat|`Round|`Space]letrepeat_kws:repeatlist=[`No_repeat;`Repeat;`Round;`Space]letstring_of_repeat:repeat->string=Kw.string_of_kwletpp_repeat=mk_ppstring_of_repeattypebackground_repeat_kw=[`Repeat_x|`Repeat_y]letbackground_repeat_kws:background_repeat_kwlist=[`Repeat_x;`Repeat_y]typebackground_repeat_=(repeat*repeat)typebackground_repeat=background_repeat_listletstring_of_background_repeat:background_repeat->string=letf(x,y)=Printf.sprintf"%s %s"(string_of_repeatx)(string_of_repeaty)instring_of_background_fletpp_background_repeat=mk_ppstring_of_background_repeattypebackground_size_kw=[`Auto|`Contain|`Cover]letbackground_size_kws:background_size_kwlist=[`Auto;`Contain;`Cover]typebackground_size_=[background_size_kw|length_percentage]letstring_of_background_size_:background_size_->string=function|#length_percentageasx->string_of_length_percentagex|#background_size_kwasx->Kw.string_of_kwxtypebackground_size=(background_size_*background_size_)listletstring_of_background_size:background_size->string=letf(x,y)=Printf.sprintf"%s %s"(string_of_background_size_x)(string_of_background_size_y)instring_of_background_fletpp_background_size=mk_ppstring_of_background_sizetypebackground_color=colorletstring_of_background_color=string_of_colorletpp_background_color=pp_colortypewidth=sizeletstring_of_width=string_of_sizeletpp_width=pp_sizetypeborder_width_kw=[`Thin|`Medium|`Thick]letborder_width_kws:border_width_kwlist=[`Thin;`Medium;`Thick]typeborder_width=[width|border_width_kw]letstring_of_border_width:border_width->string=function|#border_width_kwasx->Kw.string_of_kwx|#widthasx->string_of_widthxletpp_border_width=mk_ppstring_of_border_widthtypedisplay_outside=[`Block|`Inline|`Run_in]letdisplay_outside_kws:display_outsidelist=[`Block;`Inline;`Run_in]typedisplay_flow=[`Flow|`Flow_root]letdisplay_flow_kws:display_flowlist=[`Flow;`Flow_root]typedisplay_inside=[display_flow|`Table|`Flex|`Grid|`Ruby]letdisplay_inside_kws:display_insidelist=`Table::`Flex::`Grid::`Ruby::(display_flow_kws:>display_insidelist)typedisplay_listitem=display_outside*display_flowtypedisplay_listitem_kw=[`List_item]letdisplay_listitem_kws:display_listitem_kwlist=[`List_item]typedisplay_internal=[|`Table_row_group|`Table_header_group|`Table_footer_group|`Table_row|`Table_cell|`Table_column_group|`Table_column|`Table_caption|`Ruby_base|`Ruby_base_container|`Ruby_text|`Ruby_text_container]letdisplay_internal_kws:display_internallist=[`Table_row_group;`Table_header_group;`Table_footer_group;`Table_row;`Table_cell;`Table_column_group;`Table_column;`Table_caption;`Ruby_base;`Ruby_base_container;`Ruby_text;`Ruby_text_container]typedisplay_box=[`Contents|`None]letdisplay_box_kws:display_boxlist=[`Contents;`None]typedisplay_legacy=[`Inline_block|`Inline_table|`Inline_flex|`Inline_grid]letdisplay_legacy_kws=[`Inline_block;`Inline_table;`Inline_flex;`Inline_grid]typedisplay_out_in=display_outside*display_inside*[`List_item]optiontypedisplay=[|`Out_inofdisplay_out_in|display_internal|display_box]letstring_of_display:display->string=function|`Out_in(o,i,li)->Printf.sprintf"%s %s%s"(Kw.string_of_kwo)(Kw.string_of_kwi)(matchliwithNone->""|Somex->" "^(Kw.string_of_kwx))|#display_internal|#display_boxasx->Kw.string_of_kwxletpp_display=mk_ppstring_of_displaytypeflex_basis_kw=[`Content]letflex_basis_kws:flex_basis_kwlist=[`Content]typeflex_basis=[flex_basis_kw|width]letstring_of_flex_basis:flex_basis->string=function|#widthasx->string_of_widthx|#flex_basis_kwasx->Kw.string_of_kwxletpp_flex_basis=mk_ppstring_of_flex_basistypeflex_direction_kw=[`Column|`Column_reverse|`Row|`Row_reverse]letflex_direction_kws:flex_direction_kwlist=[`Column;`Column_reverse;`Row;`Row_reverse]typeflex_direction=flex_direction_kwletstring_of_flex_direction:flex_direction->string=function|#flex_directionasx->Kw.string_of_kwxletpp_flex_direction=mk_ppstring_of_flex_directiontypeflex_wrap_kw=[`Nowrap|`Wrap|`Wrap_reverse]letflex_wrap_kws:flex_wrap_kwlist=[`Nowrap;`Wrap;`Wrap_reverse]typeflex_wrap=flex_wrap_kwletstring_of_flex_wrap:flex_wrap->string=function|#flex_wrapasx->Kw.string_of_kwxletpp_flex_wrap=mk_ppstring_of_flex_wraptypefont_family_generic_kw=[|`Cursive|`Emoji|`Fantasy|`Fangsong|`Math|`Monospace|`Sans_serif|`Serif|`System_ui|`Ui_monospace|`Ui_rounded|`Ui_sans_serif|`Ui_serif]letfont_family_generic_kws:font_family_generic_kwlist=[`Cursive;`Emoji;`Fantasy;`Fangsong;`Math;`Monospace;`Sans_serif;`Serif;`System_ui;`Ui_monospace;`Ui_rounded;`Ui_sans_serif;`Ui_serif]typefont_family_=[`Genericoffont_family_generic_kw|`Familyofstring]letstring_of_font_family_:font_family_->string=function|`Genericg->Kw.string_of_kwg|`Familys->string_of_str{s;quoted=true}typefont_family=font_family_listletstring_of_font_family:font_family->string=string_of_list", "string_of_font_family_letpp_font_family=mk_ppstring_of_font_familytypefont_kerning=[`Normal|`Auto|`None]letfont_kerning_kws:font_kerninglist=[`Normal;`Auto;`None]letstring_of_font_kerning:font_kerning->string=Kw.string_of_kwletpp_font_kerning=mk_ppstring_of_font_kerningtypefont_size_kw=[|`Large|`Larger|`Math|`Medium|`Small|`Smaller|`Xxx_large|`Xx_large|`Xx_small|`X_large|`X_small]letfont_size_kws:font_size_kwlist=[`Large;`Larger;`Math;`Medium;`Small;`Smaller;`Xxx_large;`Xx_large;`Xx_small;`X_large;`X_small]typefont_size=[font_size_kw|length_percentage]letstring_of_font_size:font_size->string=function|#length_percentageasx->string_of_length_percentagex|#font_size_kwasx->Kw.string_of_kwxletpp_font_size=mk_ppstring_of_font_sizetypefont_stretch_kw=[`Normal|`Ultra_condensed|`Extra_condensed|`Semi_condensed|`Condensed|`Ultra_expanded|`Extra_expanded|`Semi_expanded|`Expanded]letfont_stretch_kws:font_stretch_kwlist=[`Normal;`Ultra_condensed;`Extra_condensed;`Semi_condensed;`Condensed;`Ultra_expanded;`Extra_expanded;`Semi_expanded;`Expanded]typefont_stretch=[font_stretch_kw|percentage]letstring_of_font_stretch:font_stretch->string=function|#font_stretch_kwasx->Kw.string_of_kwx|#percentageasx->string_of_percentagexletpp_font_stretch=mk_ppstring_of_font_stretchtypefont_style_kw=[`Normal|`Italic]letfont_style_kws:font_style_kwlist=[`Normal;`Italic]typefont_style=[font_style_kw|`Obliqueofangleoption]letstring_of_font_style:font_style->string=function|`Obliqueangle->Printf.sprintf"oblique%s"(matchanglewithNone->""|Somea->string_of_anglea)|#font_style_kwasx->Kw.string_of_kwxletpp_font_style=mk_ppstring_of_font_styletypefont_variant_alt=[|`Historical_forms|`Stylisticofstring|`Stylesetofstringlist|`Character_variantofstringlist|`Swashofstring|`Ornamentsofstring|`Annotationofstring]letstring_of_font_variant_alt=function|`Historical_forms->"historical-forms"|`Stylistici->Printf.sprintf"stylistic(%s)"i|`Stylesetl->Printf.sprintf"styleset(%s)"(String.concat", "l)|`Character_variantl->Printf.sprintf"character-variant(%s)"(String.concat", "l)|`Swashi->Printf.sprintf"swash(%s)"i|`Ornamentsi->Printf.sprintf"ornaments(%s)"i|`Annotationi->Printf.sprintf"annotation(%s)"itypefont_variant_alternates=[`Normal|`Listoffont_variant_altlist]letstring_of_font_variant_alternates:font_variant_alternates->string=function|`Normal->"normal"|`Listl->String.concat" "(List.mapstring_of_font_variant_altl)letpp_font_variant_alternates=mk_ppstring_of_font_variant_alternatestypefont_variant_caps=[`Normal|`Small_caps|`All_small_caps|`Petite_caps|`All_petite_caps|`Unicase|`Titling_caps]letfont_variant_caps_kws:font_variant_capslist=[`Normal;`Small_caps;`All_small_caps;`Petite_caps;`All_petite_caps;`Unicase;`Titling_caps]letstring_of_font_variant_caps:font_variant_caps->string=Kw.string_of_kwletpp_font_variant_caps=mk_ppstring_of_font_variant_capstypefont_variant_east_asian_kw=[`Jis78|`Jis83|`Jis90|`Jis04|`Ruby|`Proportional_width|`Simplified|`Traditional|`Full_width]letfont_variant_east_asian_kws:font_variant_east_asian_kwlist=[`Jis78;`Jis83;`Jis90;`Jis04;`Ruby;`Proportional_width;`Simplified;`Traditional;`Full_width]typefont_variant_east_asian=[`Normal|`Listoffont_variant_east_asian_kwlist]letstring_of_font_variant_east_asian:font_variant_east_asian->string=function|`Normal->"normal"|`Listl->String.concat" "(List.mapKw.string_of_kwl)letpp_font_variant_east_asian=mk_ppstring_of_font_variant_east_asiantypefont_variant_emoji=[`Normal|`Text|`Emoji|`Unicode]letfont_variant_emoji_kws:font_variant_emojilist=[`Normal;`Text;`Emoji;`Unicode]letstring_of_font_variant_emoji:font_variant_emoji->string=Kw.string_of_kwletpp_font_variant_emoji=mk_ppstring_of_font_variant_emojitypefont_variant_ligatures_kw=[|`Common_ligatures|`No_common_ligatures|`Contextual|`No_contextual|`Discretionary_ligatures|`No_discretionary_ligatures|`Historical_ligatures|`No_historical_ligatures]letfont_variant_ligatures_kws=[`Common_ligatures;`No_common_ligatures;`Contextual;`No_contextual;`Discretionary_ligatures;`No_discretionary_ligatures;`Historical_ligatures;`No_historical_ligatures]typefont_variant_ligatures=[`Normal|`None|`Listoffont_variant_ligatures_kwlist]letstring_of_font_variant_ligatures:font_variant_ligatures->string=function|`Listl->String.concat" "(List.mapKw.string_of_kwl)|(`None|`Normal)asx->Kw.string_of_kwxletpp_font_variant_ligatures=mk_ppstring_of_font_variant_ligaturestypefont_variant_numeric_kw=[`Ordinal|`Slashed_zero|`Lining_nums|`Oldstyle_nums|`Proportional_nums|`Tabular_nums|`Diagonal_frations|`Stacked_fractions]letfont_variant_numeric_kws=[`Ordinal;`Slashed_zero;`Lining_nums;`Oldstyle_nums;`Proportional_nums;`Tabular_nums;`Diagonal_frations;`Stacked_fractions]typefont_variant_numeric=[`Normal|`Listoffont_variant_numeric_kwlist]letstring_of_font_variant_numeric:font_variant_numeric->string=function|`Listl->String.concat" "(List.mapKw.string_of_kwl)|`Normalasx->Kw.string_of_kwxletpp_font_variant_numeric=mk_ppstring_of_font_variant_numerictypefont_variant_position=[`Normal|`Sub|`Super]letfont_variant_position_kws:font_variant_positionlist=[`Normal;`Sub;`Super]letstring_of_font_variant_position:font_variant_position->string=Kw.string_of_kwletpp_font_variant_position=mk_ppstring_of_font_variant_positiontypefont_weight_kw=[`Normal|`Bold|`Bolder|`Lighter]letfont_weight_kws=[`Normal;`Bold;`Bolder;`Lighter]typefont_weight=[font_weight_kw|`Weightofint]letstring_of_font_weight:font_weight->string=function|`Weightn->string_of_intn|#font_weight_kwasx->Kw.string_of_kwxletpp_font_weight=mk_ppstring_of_font_weighttypeline_height_kw=[`Normal]letline_height_kws:line_height_kwlist=[`Normal]typeline_height=[line_height_kw|`Numberofnumber|length_percentage]letstring_of_line_height:line_height->string=function|`Numbern->string_of_numbern|#length_percentageasx->string_of_length_percentagex|#line_height_kwasx->Kw.string_of_kwxletpp_line_height=mk_ppstring_of_line_heighttypesystem_font={family:font_family_list;size:font_size;stretch:font_stretch;style:font_style;variant_alternates:font_variant_alternates;variant_caps:font_variant_caps;variant_east_asian:font_variant_east_asian;variant_emoji:font_variant_emoji;variant_ligatures:font_variant_ligatures;variant_numeric:font_variant_numeric;variant_position:font_variant_position;weight:font_weight;line_height:line_height;}letsystem_font?(stretch=`Normal)?(style=`Normal)?(variant_alternates=`Normal)?(variant_caps=`Normal)?(variant_east_asian=`Normal)?(variant_emoji=`Normal)?(variant_ligatures=`Normal)?(variant_numeric=`Normal)?(variant_position=`Normal)?(weight=`Normal)?(line_height=`Normal)sizefamily={family;size;stretch;style;variant_alternates;variant_caps;variant_east_asian;variant_emoji;variant_ligatures;variant_numeric;variant_position;weight;line_height}typesystem_font_name=[`Caption|`Icon|`Menu|`Message_box|`Small_caption|`Status_bar]letsystem_font_names:system_font_namelist=[`Caption;`Icon;`Menu;`Message_box;`Small_caption;`Status_bar]moduleSys_font_map=Map.Make(structtypet=system_font_nameletcompare=Stdlib.compareend)letsystem_fonts_r=ref(Sys_font_map.empty:system_fontSys_font_map.t)letset_system_fontkwf=system_fonts_r:=Sys_font_map.addkwf!system_fonts_rletget_system_fontkw=Sys_font_map.find_optkw!system_fonts_rletfont_variant_css2=[`Normal;`Small_caps]letfont_stretch_css3=font_stretch_kwstypejustify_content_kw=[`Normal]letjustify_content_kws:justify_content_kwlist=[`Normal]typejustify_content=[justify_content_kw|content_distribution|content_position_lr|`Safe_pos_lrofcontent_position_lr|`Unsafe_pos_lrofcontent_position_lr]letstring_of_justify_content:justify_content->string=function|`Safe_pos_lrp->Printf.sprintf"safe %s"(string_of_content_position_lrp)|`Unsafe_pos_lrp->Printf.sprintf"unsafe %s"(string_of_content_position_lrp)|#content_distributionasx->string_of_content_distributionx|#content_position_lrasx->string_of_content_position_lrx|#justify_content_kwasx->Kw.string_of_kwxletpp_justify_content=mk_ppstring_of_justify_contenttypeheight=sizeletstring_of_height=string_of_sizeletpp_height=pp_sizetypejustify_items_kw=[`Normal|`Stretch|`Legacy]letjustify_items_kws:justify_items_kwlist=[`Normal;`Stretch;`Legacy]typejustify_items=[baseline_position|self_position_lr|`Safe_self_pos_lrofself_position_lr|`Unsafe_self_pos_lrofself_position_lr|`Legacy_lcrof[`Left|`Center|`Right]|justify_items_kw]letstring_of_justify_items:justify_items->string=function|`Safe_self_pos_lrp->Printf.sprintf"safe %s"(string_of_self_position_lrp)|`Unsafe_self_pos_lrp->Printf.sprintf"unsafe %s"(string_of_self_position_lrp)|`Legacy_lcrx->Printf.sprintf"legacy %s"(Kw.string_of_kwx)|#self_position_lrasx->string_of_self_position_lrx|#baseline_positionasx->string_of_baseline_positionx|#justify_items_kwasx->Kw.string_of_kwxletpp_justify_items=mk_ppstring_of_justify_itemstypejustify_self_kw=[`Normal|`Stretch|`Auto]letjustify_self_kws:justify_self_kwlist=[`Normal;`Stretch;`Auto]typejustify_self=[baseline_position|self_position_lr|`Safe_self_pos_lrofself_position_lr|`Unsafe_self_pos_lrofself_position_lr|`Legacy_lcrof[`Left|`Center|`Right]|justify_self_kw]letstring_of_justify_self:justify_self->string=function|`Safe_self_pos_lrp->Printf.sprintf"safe %s"(string_of_self_position_lrp)|`Unsafe_self_pos_lrp->Printf.sprintf"unsafe %s"(string_of_self_position_lrp)|`Legacy_lcrx->Printf.sprintf"legacy %s"(Kw.string_of_kwx)|#self_position_lrasx->string_of_self_position_lrx|#baseline_positionasx->string_of_baseline_positionx|#justify_self_kwasx->Kw.string_of_kwxletpp_justify_self=mk_ppstring_of_justify_selftypelist_style_image_kw=[`None]letlist_style_image_kws:list_style_image_kwlist=[`None]typelist_style_image=[`Imageofimage|list_style_image_kw]letstring_of_list_style_image:list_style_image->string=function|`Imagei->string_of_imagei|#list_style_image_kwasx->Kw.string_of_kwxletpp_list_style_image=mk_ppstring_of_list_style_imagetypelist_style_position_kw=[`Inside|`Outside]letlist_style_position_kws:list_style_position_kwlist=[`Inside;`Outside]typelist_style_position=list_style_position_kwletstring_of_list_style_position:list_style_position->string=Kw.string_of_kwletpp_list_style_position=mk_ppstring_of_list_style_positiontypelist_style_type_kw=[`None]letlist_style_type_kws:list_style_type_kwlist=[`None]typelist_style_type=[list_style_type_kw|`Ident_ofstring|`String_ofstring|`Symbols_ofstring]letstring_of_list_style_type:list_style_type->string=function|#list_style_type_kwasx->Kw.string_of_kwx|`Ident_s->s|`String_s->string_of_str{s;quoted=true}|`Symbols_s->Printf.sprintf"symbols(%s)"sletpp_list_style_type=mk_ppstring_of_list_style_typetypemargin_kw=[`Auto]letmargin_kws:margin_kwlist=[`Auto]typemargin=[margin_kw|length_percentage]letstring_of_margin:margin->string=function|#margin_kwasx->Kw.string_of_kwx|#length_percentageasx->string_of_length_percentagexletpp_margin=mk_ppstring_of_margintypepadding=length_percentageletstring_of_padding:padding->string=string_of_length_percentageletpp_padding=mk_ppstring_of_paddingtypeposition_kw=[`Static|`Relative|`Absolute|`Sticky|`Fixed]letposition_kws:position_kwlist=[`Static;`Relative;`Absolute;`Sticky;`Fixed]typeposition=position_kwletstring_of_position:position->string=Kw.string_of_kwletpp_position=mk_ppstring_of_positiontypetext_align_kw=[`Start|`End|`Left|`Right|`Center|`Justify|`Justify_all|`Match_parent]lettext_align_kws:text_align_kwlist=[`Start;`End;`Left;`Right;`Center;`Justify;`Justify_all;`Match_parent]typetext_align=text_align_kwletstring_of_text_align:text_align->string=Kw.string_of_kwletpp_text_align=mk_ppstring_of_text_aligntypetext_align_last_kw=[`Auto|`Start|`End|`Left|`Right|`Center|`Justify|`Match_parent]lettext_align_last_kws:text_align_last_kwlist=[`Auto;`Start;`End;`Left;`Right;`Center;`Justify;`Match_parent]typetext_align_last=text_align_last_kwletstring_of_text_align_last:text_align_last->string=Kw.string_of_kwletpp_text_align_last=mk_ppstring_of_text_align_lasttypevertical_align_kw=[`Baseline|`Sub|`Super|`Top|`Text_top|`Middle|`Bottom|`Text_bottom]letvertical_align_kws:vertical_align_kwlist=[`Baseline;`Sub;`Super;`Top;`Text_top;`Middle;`Bottom;`Text_bottom]typevertical_align=[vertical_align_kw|length_percentage]letstring_of_vertical_align:vertical_align->string=function|#vertical_align_kwasx->Kw.string_of_kwx|#length_percentageasx->string_of_length_percentagexletpp_vertical_align=mk_ppstring_of_vertical_aligntypevisibility_kw=[`Visible|`Hidden|`Collapse]letvisibility_kws:visibility_kwlist=[`Visible;`Hidden;`Collapse]typevisibility=visibility_kwletstring_of_visibility:visibility->string=Kw.string_of_kwletpp_visibilty=mk_ppstring_of_visibilitytypewhite_space_kw=[`Normal|`Nowrap|`Pre|`Pre_wrap|`Pre_line|`Break_spaces]letwhite_space_kws:white_space_kwlist=[`Normal;`Nowrap;`Pre;`Pre_wrap;`Pre_line;`Break_spaces]typewhite_space=white_space_kwletstring_of_white_space:white_space->string=Kw.string_of_kwletpp_white_space=mk_ppstring_of_white_spacetypeword_spacing_kw=[`Normal]letword_spacing_kws:word_spacing_kwlist=[`Normal]typeword_spacing=[word_spacing_kw|`Lengthofnumber*length_unit]letstring_of_word_spacing:word_spacing->string=function|`Length(n,u)->string_of_lengthnu|#word_spacing_kwasx->Kw.string_of_kwxletpp_word_spacing=mk_ppstring_of_word_spacing