sig
  type mode = [ `Fullscreen | `Windowed ]
  val mode : Useri.Surface.mode React.signal
  val set_mode_setter : Useri.Surface.mode React.event -> unit
  val mode_flip : 'React.event -> Useri.Surface.mode React.event
  val pp_mode : Format.formatter -> Useri.Surface.mode -> unit
  module Gl :
    sig
      type colors = [ `RGBA_8888 | `RGB_565 ]
      type depth = [ `D_16 | `D_24 ]
      type stencil = [ `S_8 ]
      type t = {
        accelerated : bool option;
        multisample : int option;
        doublebuffer : bool;
        stereo : bool;
        srgb : bool;
        colors : Useri.Surface.Gl.colors;
        depth : Useri.Surface.Gl.depth option;
        stencil : Useri.Surface.Gl.stencil option;
        version : int * int;
      }
      val default : Useri.Surface.Gl.t
    end
  type handle = Useri_base.Surface.handle
  type kind = [ `Gl of Useri.Surface.Gl.t | `Other ]
  type t
  val create :
    ?hidpi:bool ->
    ?pos:Gg.p2 ->
    ?size:Gg.size2 ->
    ?kind:Useri.Surface.kind ->
    ?handle:Useri.Surface.handle ->
    ?mode:Useri.Surface.mode -> unit -> Useri.Surface.t
  val pos : Gg.p2 React.signal
  val raster_size : Gg.size2 React.signal
  val size : Gg.size2 React.signal
  val update : unit -> unit
  val handle : unit -> Useri_base.Surface.handle
  val refresh : float React.event
  val request_refresh : unit -> unit
  val set_refresher : 'React.event -> unit
  val steady_refresh : until:'React.event -> unit
  val refresh_hz : int React.signal
  val set_refresh_hz : int -> unit
end