Sheet.res

 1@module("react-modal-sheet") @jsx.component
 2external make: (
 3  ~children: Jsx.element,
 4  ~isOpen: bool,
 5  ~onClose: unit => unit,
 6  ~ref: PreactDOM.Ref.t=?,
 7  ~avoidKeyboard: bool=?,
 8  ~disableDrag: bool=?,
 9  ~disableDismiss: bool=?,
10  ~disableScrollLocking: bool=?,
11  ~detent: [#default | #content | #full]=?,
12  ~onOpenStart: unit => unit=?,
13  ~onOpenEnd: unit => unit=?,
14  ~onCloseStart: unit => unit=?,
15  ~onCloseEnd: unit => unit=?,
16  ~onSnap: (~index: int) => unit=?, // index of the point in snapPoints
17  ~snapPoints: array<float>=?, // required when using onSnap, initialSnap
18  ~initialSnap: int=?, // index of initial snappoint from snapPoints
19  ~modalEffectRootId: string=?, // id of the app mount point for iOS modal effect
20  ~modelEffectThreshold: float=?, // percent 0-1 where modal effect should start
21  ~tweenConfig: {"ease": string, "duration": float}=?, // default: easeOut, 0.2
22  ~mountPoint: nullable<Dom.element>=?,
23  ~prefersReducedMotion: bool=?,
24  ~dragVelocityThreshold: int=?,
25  ~dragCloseThreshold: float=?,
26  ~unstyled: bool=?,
27) => // true to remove all styles to customize appearance
28Jsx.element = "Sheet"
29
30module Container = {
31  @module("react-modal-sheet") @scope("Sheet") @jsx.component
32  external make: (~children: Jsx.element=?) => Jsx.element = "Container"
33}
34
35module Header = {
36  @module("react-modal-sheet") @scope("Sheet") @jsx.component
37  external make: (~children: Jsx.element=?, ~disableDrag: bool=?) => Jsx.element = "Header"
38}
39
40module DragIndicator = {
41  @module("react-modal-sheet") @scope("Sheet") @jsx.component
42  external make: unit => Jsx.element = "DragIndicator"
43}
44
45module Content = {
46  @module("react-modal-sheet") @scope("Sheet") @jsx.component
47  external make: (
48    ~children: Jsx.element=?,
49    ~disableDrag: bool=?,
50    ~disableScroll: bool=?,
51    ~scrollRef: ref<'value>=?,
52  ) => Jsx.element = "Content"
53}
54
55module Backdrop = {
56  @module("react-modal-sheet") @scope("Sheet") @jsx.component
57  external make: unit => Jsx.element = "Backdrop"
58}
59
60/////////////////////////////////////////
61// Imperative methods on the dom element
62/////////////////////////////////////////
63
64@send external _snapIt: (Dom.element, int) => unit = "snapTo"
65
66/** Imperatively snap to a particular snap point index */
67let snapTo = (ref: PreactDOM.Ref.currentDomRef, pt: int): unit => {
68  switch Nullable.toOption(ref.current) {
69  | Some(sheet) => _snapIt(sheet, pt)
70  | None => ()
71  }
72}
73
74@get external _getSnap: Dom.element => int = "currentSnap"
75@get external _getY: Dom.element => int = "y"
76
77/** Get the current snap point index from a ref */
78let currentSnap = (ref: PreactDOM.Ref.currentDomRef): int => {
79  switch Nullable.toOption(ref.current) {
80  | Some(sheet) => _getSnap(sheet)
81  | None => 0
82  }
83}
84
85let y = (ref: PreactDOM.Ref.currentDomRef): int => {
86  switch Nullable.toOption(ref.current) {
87  | Some(sheet) => _getY(sheet)
88  | None => -1
89  }
90}