This module has a small collection of helpful bits of javascript that have no other obvious home.

`module Rect : sig ... end`
`val round_float_rect : ?⁠round:(float ‑> int) ‑> float Rect.t ‑> int Rect.t`
`val viewport_rect : unit ‑> int Rect.t`

`viewport_rect ()` gives you the rectangle that corresponds to the size of the entire browser window

`val viewport_rect_of_element : Js_of_ocaml.Dom_html.element Js_of_ocaml.Js.t ‑> float Rect.t`

`viewport_rect_of_element el` gives you the bounding box rectangle for a single element

`val client_rect : unit ‑> int Rect.t`

`client_rect ()` gives you the rectangle that corresponds to the size of the entire browser window without the scroll bars.

`val client_rect_of_element : Js_of_ocaml.Dom_html.element Js_of_ocaml.Js.t ‑> float Rect.t`

`client_rect_of_element el` gives you the inner box rectangle for a single element, not including its scroll bars if it has any.

`val element_is_in_viewport : Js_of_ocaml.Dom_html.element Js_of_ocaml.Js.t ‑> bool`

Returns true iff the element in question is in view.

`val scroll : ?⁠id:string ‑> unit ‑> unit`

Find an element with an id (default as "keep-in-view"), and, if it exists, scrolls the UI so that that element is in view.

`type rows_or_columns````=`

`|` `Rows`
`|` `Columns`

``
`include sig ... end`
`val rows_or_columns_of_sexp : Base.Sexp.t ‑> rows_or_columns`
`val sexp_of_rows_or_columns : rows_or_columns ‑> Base.Sexp.t`
`val bin_rows_or_columns : rows_or_columns Bin_prot.Type_class.t`
`val bin_read_rows_or_columns : rows_or_columns Bin_prot.Read.reader`
`val __bin_read_rows_or_columns__ : (int ‑> rows_or_columns) Bin_prot.Read.reader`
`val bin_reader_rows_or_columns : rows_or_columns Bin_prot.Type_class.reader`
`val bin_size_rows_or_columns : rows_or_columns Bin_prot.Size.sizer`
`val bin_write_rows_or_columns : rows_or_columns Bin_prot.Write.writer`
`val bin_writer_rows_or_columns : rows_or_columns Bin_prot.Type_class.writer`
`val bin_shape_rows_or_columns : Bin_prot.Shape.t`
`val rows : rows_or_columns`
`val columns : rows_or_columns`
`module Variants_of_rows_or_columns : sig ... end`
`val compare_rows_or_columns : rows_or_columns ‑> rows_or_columns ‑> int`
`val find_visible_range : length:int ‑> nth_element_id:(int ‑> string) ‑> rows_or_columns ‑> (int * int) option`

`find_visible_range ~length ~nth_element_id layout` is useful to find visible rows or columns of a table. The time cost is O(log(length)). It assumes the rows/columns are non-overlapping and arranged monotonically, though the order doesn't matter. It's assumed that the rows are laid out from `0` to `length - 1`.

If no row is visible, then `None` is returned. Otherwise, the inclusive upper and lower bounds of the visible rows are returned.

`val get_scroll_container : Js_of_ocaml.Dom.#node Js_of_ocaml.Js.t ‑> Js_of_ocaml.Dom.node Js_of_ocaml.Js.t`

`scroll_container node` finds the closest scrollable ancestor in the DOM tree. If there is no scrollable element above the node passed in, then the document will be returned