summaryrefslogtreecommitdiff
path: root/blog/sidebar.ml
blob: ed4b8566db135df9b2667cff88bb5cb3dd9bdcab (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
open StdLabels
open Brr
open Brr_note
open Note

(** Return the sidebar *)
let get
  : unit -> El.t option
  = fun () ->

    List.find_opt (El.children @@ Document.body G.document)
      ~f:(fun t -> El.has_tag_name El.Name.aside t)

let rec clean
  : El.t -> unit
  = fun el ->
    List.iter (El.children el)
      ~f:(fun el ->
          (* Remove the links from the sidebar, keep h1 and other stuff *)
          if (El.has_tag_name (Jstr.v "nav") el)
          || (El.has_tag_name (Jstr.v "ul") el) then
            El.remove el
          else
            clean el
        )

(** Create a slider element, and the event on change *)
let slider ~at =
  let slider =
    El.input ~at () in

  let event =
    Evr.on_el
      Ev.input
      (fun _ ->
         let raw_value = El.prop El.Prop.value slider in
         Jstr.to_int raw_value)
      slider
  in
  slider, event

let click_event el =
  Evr.on_el
    Ev.click
    Evr.unit
    el

let show_value = function
  | None -> El.txt' ""
  | Some input ->
    El.txt (Jstr.of_int input)

let add_button
  : El.t -> unit E.t
  = fun element ->

    let open El in

    let delete =
      button
        [ El.i
            ~at:At.[ class' (Jstr.v "fas")
                   ; class' (Jstr.v "fa-times-circle") ]
            []
        ; txt' "Delete "] in

    let delete_event = click_event delete in

    let export =
      button
        [ El.i
            ~at:At.[ class' (Jstr.v "fas")
                   ; class' (Jstr.v "fa-download") ]
            []
        ; txt' "Download"] in


    let nib_size, value  =
      slider
        ~at:At.[ type' (Jstr.v "range")
               ; v (Jstr.v "min") (Jstr.v "0")
               ; v (Jstr.v "max") (Jstr.v "50")
               ; id (Jstr.v "nib_size")
               ] in

    let width = El.div [] in
    Elr.set_children
      width
      ~on:(value
           |> E.map (fun v ->
               [ txt' "Width : "
               ; show_value v ]
             )
          );

    let input_angle, angle_event =
      slider
        ~at:At.[ type' (Jstr.v "range")
               ; v (Jstr.v "min") (Jstr.v "0")
               ; v (Jstr.v "max") (Jstr.v "90")] in
    let angle = El.div [] in
    Elr.set_children
      angle
      ~on:(angle_event
           |> E.map (fun v ->
               [ txt' "Angle : "
               ; show_value v
               ; txt' "°" ]
             )
          );

    let click = Evr.on_el Ev.click Evr.unit delete in
    let _ = click in

    let () =
      El.append_children element
        [ hr ()
        ; delete
        ; export
        ; hr ()

        ; width
        ; nib_size
        ; El.br ()

        ; angle
        ; input_angle

        ]
    in
    delete_event