123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400(** Interactivity utilities for selection, scroll behavior, and more
What's included:
- Text selection, scroll behavior, scroll snap, resize.
What's not:
- Browser-specific interaction properties not surfaced in `Css`.
- Cursor utilities (now in Cursor module).
Parsing contract (`of_string`):
- Accepts tokens like ["select"; "none"], ["scroll"; "smooth"],
["snap"; "x"], ["resize"; "y"], etc. Unknown tokens yield `Error (`Msg
"Not an interactivity utility")`. *)moduleCss=Cascade.CssmoduleHandler=structopenStyleopenCssleterr_not_utility=Error(`Msg"Not an interactivity utility")typet=|Select_none|Select_text|Select_all|Select_auto|Scroll_auto|Scroll_smooth|Snap_start|Snap_end|Snap_center|Snap_none|Snap_x|Snap_y|Snap_both|Snap_mandatory|Snap_proximity|Snap_align_none|Snap_normal|Snap_always|Resize_none|Resize|Resize_x|Resize_y|Pointer_events_none|Pointer_events_auto|Appearance_auto|Appearance_none|Will_change_auto|Will_change_scroll|Will_change_contents|Will_change_transform|Will_change_arbitraryofstring|Group(** Marker class for group parent *)|Peer(** Marker class for peer sibling *)|Scheme_dark|Scheme_light|Scheme_light_dark|Scheme_normal|Scheme_only_dark|Scheme_only_lightletname="interactivity"(* Interaction controls from resize through appearance share priority 11 so
they can sit between cursor and columns. Scroll behavior follows overflow
and overscroll at priority 18; user-select and will-change sort late. *)letpriority=function|Resize|Resize_none|Resize_x|Resize_y|Appearance_auto|Appearance_none|Snap_start|Snap_end|Snap_center|Snap_none|Snap_x|Snap_y|Snap_both|Snap_mandatory|Snap_proximity|Snap_align_none|Snap_normal|Snap_always->11|Scroll_auto|Scroll_smooth->18|Scheme_dark|Scheme_light|Scheme_light_dark|Scheme_normal|Scheme_only_dark|Scheme_only_light->27|Will_change_auto|Will_change_scroll|Will_change_contents|Will_change_transform|Will_change_arbitrary_->33|Select_none|Select_text|Select_all|Select_auto->38(* Tailwind's utility order opens with the container utilities and then
pointer-events, before the layout group. *)|Pointer_events_none|Pointer_events_auto->-1|_->31letselect_none_s=style[webkit_user_selectNone;user_selectNone]letselect_text_s=style[webkit_user_selectText;user_selectText]letselect_all_s=style[webkit_user_selectAll;user_selectAll]letselect_auto_s=style[webkit_user_selectAuto;user_selectAuto]letscroll_auto_s=style[scroll_behaviorAuto]letscroll_smooth_s=style[scroll_behaviorSmooth](* Reference to the global scroll snap strictness variable *)letscroll_snap_strictness_var=Var.property_defaultCss.Scroll_snap_strictness~initial:Proximity~property_order:90"tw-scroll-snap-strictness"letsnap_start_s=style[scroll_snap_alignStart]letsnap_end_s=style[scroll_snap_alignEnd]letsnap_center_s=style[scroll_snap_alignCenter]letsnap_none_s=style[scroll_snap_type(AxisNone)](* For snap-x, snap-y, snap-both we compose the axis with a variable reference
to strictness *)letsnap_x_s=letref_=Var.referencescroll_snap_strictness_varinletproperty_rules=Var.property_rulesscroll_snap_strictness_varinstyle~property_rules[scroll_snap_type(Axis_with_strictness(X,Varref_))]letsnap_y_s=letref_=Var.referencescroll_snap_strictness_varinletproperty_rules=Var.property_rulesscroll_snap_strictness_varinstyle~property_rules[scroll_snap_type(Axis_with_strictness(Y,Varref_))]letsnap_both_s=letref_=Var.referencescroll_snap_strictness_varinletproperty_rules=Var.property_rulesscroll_snap_strictness_varinstyle~property_rules[scroll_snap_type(Axis_with_strictness(Both,Varref_))]letsnap_mandatory_s=letd=Var.setscroll_snap_strictness_varMandatoryinletproperty_rules=Var.property_rulesscroll_snap_strictness_varinstyle~property_rules(d::[])letsnap_proximity_s=letd=Var.setscroll_snap_strictness_varProximityinletproperty_rules=Var.property_rulesscroll_snap_strictness_varinstyle~property_rules(d::[])letsnap_align_none_s=style[scroll_snap_alignNone]letsnap_normal_s=style[scroll_snap_stopNormal]letsnap_always_s=style[scroll_snap_stopAlways]letresize_none_s=style[Css.resizeNone]letresize_s=style[Css.resizeBoth]letresize_x_s=style[Css.resizeHorizontal]letresize_y_s=style[Css.resizeVertical](* Additional utilities *)letpointer_events_none_s=style[pointer_eventsNone]letpointer_events_auto_s=style[pointer_eventsAuto]letappearance_auto_s=style[appearanceAuto]letappearance_none_s=style[appearanceNone]letwill_change_auto_s=style[will_changeCss.Will_change_auto]letwill_change_scroll_s=style[will_changeCss.Scroll_position]letwill_change_contents_s=style[will_changeCss.Contents]letwill_change_transform_s=style[will_changeCss.Transform]letgroup_s=style[]letpeer_s=style[]letscheme_dark_s=style[color_schemeDark]letscheme_light_s=style[color_schemeLight]letscheme_light_dark_s=style[color_schemeLight_dark]letscheme_normal_s=style[color_schemeNormal]letscheme_only_dark_s=style[color_schemeOnly_dark]letscheme_only_light_s=style[color_schemeOnly_light]letto_style_theme=function|Select_none->select_none_s|Select_text->select_text_s|Select_all->select_all_s|Select_auto->select_auto_s|Scroll_auto->scroll_auto_s|Scroll_smooth->scroll_smooth_s|Snap_start->snap_start_s|Snap_end->snap_end_s|Snap_center->snap_center_s|Snap_none->snap_none_s|Snap_x->snap_x_s|Snap_y->snap_y_s|Snap_both->snap_both_s|Snap_mandatory->snap_mandatory_s|Snap_proximity->snap_proximity_s|Snap_align_none->snap_align_none_s|Snap_normal->snap_normal_s|Snap_always->snap_always_s|Resize_none->resize_none_s|Resize->resize_s|Resize_x->resize_x_s|Resize_y->resize_y_s|Pointer_events_none->pointer_events_none_s|Pointer_events_auto->pointer_events_auto_s|Appearance_auto->appearance_auto_s|Appearance_none->appearance_none_s|Will_change_auto->will_change_auto_s|Will_change_scroll->will_change_scroll_s|Will_change_contents->will_change_contents_s|Will_change_transform->will_change_transform_s|Will_change_arbitrarys->ifParse.is_varsthenletbare_name=Parse.extract_var_namesinstyle[will_change(Var(Var.bracketbare_name))]elseletraw=Parse.decode_underscoressinletprops=String.split_on_char','raw|>List.mapString.triminstyle[will_change(Propertiesprops)]|Group->group_s|Peer->peer_s|Scheme_dark->scheme_dark_s|Scheme_light->scheme_light_s|Scheme_light_dark->scheme_light_dark_s|Scheme_normal->scheme_normal_s|Scheme_only_dark->scheme_only_dark_s|Scheme_only_light->scheme_only_light_sletsuborder=function|Scroll_auto->700|Scroll_smooth->701|Select_all->2|Select_auto->3|Select_none->4|Select_text->5(* Snap utilities are grouped by their property-order key. Candidate names
settle ties inside each property band. *)|Snap_both|Snap_none|Snap_x|Snap_y->1_100_000|Snap_mandatory|Snap_proximity->1_110_000|Snap_align_none|Snap_center|Snap_end|Snap_start->1_120_000|Snap_always|Snap_normal->1_130_000(* resize (priority 11) - after cursor (<1000), before list-style (~2M) *)|Resize->1_000_000+22|Resize_none->1_000_000+23|Resize_x->1_000_000+24|Resize_y->1_000_000+25|Pointer_events_auto->26|Pointer_events_none->27(* appearance (priority 11) - after list-style (~2M) *)|Appearance_auto->3_000_000+28|Appearance_none->3_000_000+29|Will_change_auto->31|Will_change_contents->32|Will_change_scroll->33|Will_change_transform->34|Will_change_arbitrary_->30|Group->35|Peer->36|Scheme_dark->-100|Scheme_light->-99|Scheme_light_dark->-98|Scheme_normal->-97|Scheme_only_dark->-96|Scheme_only_light->-95letof_class_themeclass_name=letparts=Parse.split_classclass_nameinmatchpartswith|["select";"none"]->OkSelect_none|["select";"text"]->OkSelect_text|["select";"all"]->OkSelect_all|["select";"auto"]->OkSelect_auto|["scroll";"auto"]->OkScroll_auto|["scroll";"smooth"]->OkScroll_smooth|["snap";"start"]->OkSnap_start|["snap";"end"]->OkSnap_end|["snap";"center"]->OkSnap_center|["snap";"none"]->OkSnap_none|["snap";"x"]->OkSnap_x|["snap";"y"]->OkSnap_y|["snap";"both"]->OkSnap_both|["snap";"mandatory"]->OkSnap_mandatory|["snap";"proximity"]->OkSnap_proximity|["snap";"align";"none"]->OkSnap_align_none|["snap";"normal"]->OkSnap_normal|["snap";"always"]->OkSnap_always|["resize";"none"]->OkResize_none|["resize"]->OkResize|["resize";"x"]->OkResize_x|["resize";"y"]->OkResize_y|["pointer";"events";"none"]->OkPointer_events_none|["pointer";"events";"auto"]->OkPointer_events_auto|["appearance";"auto"]->OkAppearance_auto|["appearance";"none"]->OkAppearance_none|["will";"change";"auto"]->OkWill_change_auto|["will";"change";"scroll"]->OkWill_change_scroll|["will";"change";"contents"]->OkWill_change_contents|["will";"change";"transform"]->OkWill_change_transform|["will";"change";value]whenParse.is_bracket_valuevalue->letinner=Parse.bracket_innervaluein(* [will-change] takes property names, so anything that is not an
identifier - the docs' [<value>] placeholder included - is not
one. *)ifParse.is_varinner||String.split_on_char','inner|>List.mapString.trim|>List.for_all(funp->Parse.is_ident(Parse.decode_underscoresp|>String.trim))thenOk(Will_change_arbitraryinner)elseerr_not_utility|["group"]->OkGroup|["peer"]->OkPeer|["scheme";"dark"]->OkScheme_dark|["scheme";"light"]->OkScheme_light|["scheme";"light";"dark"]->OkScheme_light_dark|["scheme";"normal"]->OkScheme_normal|["scheme";"only";"dark"]->OkScheme_only_dark|["scheme";"only";"light"]->OkScheme_only_light|_->err_not_utilityletto_class=function|Select_none->"select-none"|Select_text->"select-text"|Select_all->"select-all"|Select_auto->"select-auto"|Scroll_auto->"scroll-auto"|Scroll_smooth->"scroll-smooth"|Snap_start->"snap-start"|Snap_end->"snap-end"|Snap_center->"snap-center"|Snap_none->"snap-none"|Snap_x->"snap-x"|Snap_y->"snap-y"|Snap_both->"snap-both"|Snap_mandatory->"snap-mandatory"|Snap_proximity->"snap-proximity"|Snap_align_none->"snap-align-none"|Snap_normal->"snap-normal"|Snap_always->"snap-always"|Resize_none->"resize-none"|Resize->"resize"|Resize_x->"resize-x"|Resize_y->"resize-y"|Pointer_events_none->"pointer-events-none"|Pointer_events_auto->"pointer-events-auto"|Appearance_auto->"appearance-auto"|Appearance_none->"appearance-none"|Will_change_auto->"will-change-auto"|Will_change_scroll->"will-change-scroll"|Will_change_contents->"will-change-contents"|Will_change_transform->"will-change-transform"|Will_change_arbitrarys->"will-change-["^s^"]"|Group->"group"|Peer->"peer"|Scheme_dark->"scheme-dark"|Scheme_light->"scheme-light"|Scheme_light_dark->"scheme-light-dark"|Scheme_normal->"scheme-normal"|Scheme_only_dark->"scheme-only-dark"|Scheme_only_light->"scheme-only-light"letexamples=[Select_none;Scroll_auto;Snap_x;Snap_start;Snap_always;Snap_mandatory;Resize_none;Pointer_events_none;Appearance_none;Will_change_auto;Scheme_dark;]endopenHandlermoduleUtility_factory=Utility.Make(Handler)letutility=Utility_factory.vletselect_none=utilitySelect_noneletselect_text=utilitySelect_textletselect_all=utilitySelect_allletselect_auto=utilitySelect_autoletscroll_auto=utilityScroll_autoletscroll_smooth=utilityScroll_smoothletsnap_start=utilitySnap_startletsnap_end=utilitySnap_endletsnap_center=utilitySnap_centerletsnap_none=utilitySnap_noneletsnap_x=utilitySnap_xletsnap_y=utilitySnap_yletsnap_both=utilitySnap_bothletsnap_mandatory=utilitySnap_mandatoryletsnap_proximity=utilitySnap_proximityletsnap_align_none=utilitySnap_align_noneletsnap_normal=utilitySnap_normalletsnap_always=utilitySnap_alwaysletresize_none=utilityResize_noneletresize=utilityResizeletresize_x=utilityResize_xletresize_y=utilityResize_yletpointer_events_none=utilityPointer_events_noneletpointer_events_auto=utilityPointer_events_autoletappearance_auto=utilityAppearance_autoletappearance_none=utilityAppearance_noneletwill_change_auto=utilityWill_change_autoletwill_change_scroll=utilityWill_change_scrollletwill_change_contents=utilityWill_change_contentsletwill_change_transform=utilityWill_change_transformletgroup=utilityGroupletpeer=utilityPeerletscheme_dark=utilityScheme_darkletscheme_light=utilityScheme_lightletscheme_light_dark=utilityScheme_light_darkletscheme_normal=utilityScheme_normalletscheme_only_dark=utilityScheme_only_darkletscheme_only_light=utilityScheme_only_light