-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasefn__Switch.res
More file actions
62 lines (55 loc) · 1.5 KB
/
Basefn__Switch.res
File metadata and controls
62 lines (55 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
%%raw(`import './Basefn__Switch.css'`)
open Xote
type size = Sm | Md | Lg
let sizeToString = (size: size) => {
switch size {
| Sm => "sm"
| Md => "md"
| Lg => "lg"
}
}
@jsx.component
let make = (
~checked: Signal.t<bool>,
~onChange: option<unit => unit>=?,
~label: option<string>=?,
~disabled: bool=false,
~size: size=Md,
) => {
let handleClick = _ => {
if !disabled {
Signal.update(checked, prev => !prev)
switch onChange {
| Some(callback) => callback()
| None => ()
}
}
}
let getWrapperClass = () => {
let baseClass = "basefn-switch-wrapper"
let disabledClass = disabled ? " basefn-switch-wrapper--disabled" : ""
baseClass ++ disabledClass
}
let getSwitchClass = () => {
let baseClass = "basefn-switch"
let sizeClass = size != Md ? " basefn-switch--" ++ sizeToString(size) : ""
let checkedClass = Computed.make(() => Signal.get(checked) ? " basefn-switch--checked" : "")
let disabledClass = disabled ? " basefn-switch--disabled" : ""
baseClass ++ sizeClass ++ disabledClass
}
<label class={getWrapperClass()}>
<div
class={Computed.make(() =>
getSwitchClass() ++
Signal.get(Computed.make(() => Signal.get(checked) ? " basefn-switch--checked" : ""))
)}
onClick={handleClick}
>
<div class="basefn-switch__slider" />
</div>
{switch label {
| Some(labelText) => <span class="basefn-switch-label"> {Node.text(labelText)} </span>
| None => <> </>
}}
</label>
}