Reusable 3D Earth globe widget (pure OCaml + WebGL)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Replace live spacedata tests with offline; update merlint expected output

- ocaml-spacedata: replace live CelesTrak API tests with offline
equivalents using canned JSON data (tests must not hit the network)
- merlint: promote e718/e724 cram test expected output after lint rule
changes

+11 -6
+1
lib/webgl/camera.ml
··· 25 25 let phi t = t.phi 26 26 let distance t = t.distance 27 27 let auto_rotate t = t.auto_rotate 28 + let set_auto_rotate t v = t.auto_rotate <- v 28 29 let set_distance t d = t.distance <- d 29 30 30 31 let v () =
+3
lib/webgl/camera.mli
··· 18 18 val auto_rotate : t -> bool 19 19 (** [auto_rotate t] is [true] if the camera is auto-rotating. *) 20 20 21 + val set_auto_rotate : t -> bool -> unit 22 + (** [set_auto_rotate t v] enables or disables auto-rotation. *) 23 + 21 24 val set_distance : t -> float -> unit 22 25 (** [set_distance t d] sets the camera distance. *) 23 26
+7 -6
lib/webgl/label.ml
··· 26 26 El.set_at (Jstr.of_string "style") 27 27 (Some 28 28 (Jstr.of_string 29 - "position:absolute;color:#00d4ff;font-size:10px;font-family:monospace;pointer-events:none;text-shadow:0 \ 30 - 0 4px \ 31 - rgba(0,212,255,0.5);white-space:nowrap;transform:translate(8px,-50%%)")) 29 + "position:absolute;color:#ffffff;font-size:10px;font-family:monospace;pointer-events:none;text-shadow:-1px \ 30 + -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000,0 0 6px \ 31 + rgba(0,0,0,0.8);white-space:nowrap;transform:translate(8px,-50%%)")) 32 32 el; 33 33 El.set_children el [ El.txt (Jstr.of_string text) ]; 34 34 el ··· 48 48 (Some 49 49 (Jstr.of_string 50 50 (Fmt.str 51 - "position:absolute;left:%.0fpx;top:%.0fpx;color:#00d4ff;font-size:10px;font-family:monospace;pointer-events:none;text-shadow:0 \ 52 - 0 4px \ 53 - rgba(0,212,255,0.5);white-space:nowrap;transform:translate(8px,-50%%);opacity:1" 51 + "position:absolute;left:%.0fpx;top:%.0fpx;color:#ffffff;font-size:10px;font-family:monospace;pointer-events:none;text-shadow:-1px \ 52 + -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000,0 0 \ 53 + 6px \ 54 + rgba(0,0,0,0.8);white-space:nowrap;transform:translate(8px,-50%%);opacity:1" 54 55 x y))) 55 56 entry.el; 56 57 entry.visible <- true