mirror of https://github.com/status-im/reagent.git
commit
bd1c04e0b3
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
PROF = dev
|
||||||
|
# PROF = dev,test,srcmap
|
||||||
|
# PROF = prod,test
|
||||||
|
# PROF = prod
|
||||||
|
|
||||||
|
CLJSBUILD = client
|
||||||
|
|
||||||
|
all: autocompile
|
||||||
|
|
||||||
|
run: openbrowser autocompile
|
||||||
|
|
||||||
|
openbrowser:
|
||||||
|
(sleep 1 && open example.html) &
|
||||||
|
|
||||||
|
autocompile:
|
||||||
|
lein with-profile $(PROF) cljsbuild auto $(CLJSBUILD)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
lein -o clean
|
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
div, h1, input {
|
||||||
|
font-family: HelveticaNeue, Helvetica;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-clock {
|
||||||
|
font-size: 128px;
|
||||||
|
line-height: 1.2em;
|
||||||
|
font-family: HelveticaNeue-UltraLight, Helvetica;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.example-clock {
|
||||||
|
font-size: 64px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-input, .color-input input {
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>reagent svg example</title>
|
||||||
|
<link rel="stylesheet" href="example.css">
|
||||||
|
</head>
|
||||||
|
<body style="margin-left: -1px; margin-top: -1px">
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="text/javascript" src="target/client.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
core.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
|
||||||
|
(defproject geometry-reagent "0.1.0"
|
||||||
|
:dependencies [[org.clojure/clojure "1.5.1"]
|
||||||
|
[org.clojure/clojurescript "0.0-2138"]
|
||||||
|
[reagent "0.4.0-SNAPSHOT"]]
|
||||||
|
:plugins [[lein-cljsbuild "1.0.1"]]
|
||||||
|
:hooks [leiningen.cljsbuild]
|
||||||
|
:profiles {:prod {:cljsbuild
|
||||||
|
{:builds
|
||||||
|
{:client {:compiler
|
||||||
|
{:optimizations :advanced
|
||||||
|
:preamble ^:replace ["reagent/react.min.js"]
|
||||||
|
:pretty-print false}}}}}
|
||||||
|
:srcmap {:cljsbuild
|
||||||
|
{:builds
|
||||||
|
{:client {:compiler
|
||||||
|
{:source-map "target/client.js.map"
|
||||||
|
:source-map-path "client"}}}}}}
|
||||||
|
:source-paths ["src"]
|
||||||
|
:cljsbuild
|
||||||
|
{:builds
|
||||||
|
{:client {:source-paths ["src"]
|
||||||
|
:compiler
|
||||||
|
{:preamble ["reagent/react.js"]
|
||||||
|
:output-dir "target/client"
|
||||||
|
:output-to "target/client.js"
|
||||||
|
:pretty-print true}}}})
|
|
@ -0,0 +1,59 @@
|
||||||
|
(ns components
|
||||||
|
(:require [reagent.core :as r]
|
||||||
|
[geometry :refer [x y dist] :as g]))
|
||||||
|
|
||||||
|
(def point-defaults
|
||||||
|
{:stroke "black"
|
||||||
|
:stroke-width 2
|
||||||
|
:fill "blue"
|
||||||
|
:r 5})
|
||||||
|
|
||||||
|
(def segment-defaults
|
||||||
|
{:stroke "black"
|
||||||
|
:stroke-width 2})
|
||||||
|
|
||||||
|
(def circle-defaults
|
||||||
|
{:fill "rgba(255,0,0,0.1)"
|
||||||
|
:stroke "black"
|
||||||
|
:stroke-width 2})
|
||||||
|
|
||||||
|
(defn point [p]
|
||||||
|
[:circle
|
||||||
|
(merge point-defaults
|
||||||
|
{:cx (x p) :cy (y p)})])
|
||||||
|
|
||||||
|
(defn drag [mouse-info p]
|
||||||
|
(when (:mouse-down? @mouse-info)
|
||||||
|
(reset! p (g/point (:x @mouse-info)
|
||||||
|
(:y @mouse-info)))
|
||||||
|
(r/next-tick
|
||||||
|
(fn []
|
||||||
|
(drag mouse-info p)))))
|
||||||
|
|
||||||
|
(defn draggable-point [p mouse-info]
|
||||||
|
[:circle
|
||||||
|
(merge point-defaults
|
||||||
|
{:on-mouse-down #(do
|
||||||
|
(swap! mouse-info assoc :mouse-down? true)
|
||||||
|
(drag mouse-info p))
|
||||||
|
:cx (x @p)
|
||||||
|
:cy (y @p)})])
|
||||||
|
|
||||||
|
(defn segment [from to]
|
||||||
|
[:line
|
||||||
|
(merge segment-defaults
|
||||||
|
{:x1 (x from) :y1 (y from)
|
||||||
|
:x2 (x to) :y2 (y to)})])
|
||||||
|
|
||||||
|
(defn triangle [a b c]
|
||||||
|
[:g
|
||||||
|
[segment a b]
|
||||||
|
[segment b c]
|
||||||
|
[segment c a]])
|
||||||
|
|
||||||
|
(defn circle [c r]
|
||||||
|
[:circle
|
||||||
|
(merge circle-defaults
|
||||||
|
{:cx (x c)
|
||||||
|
:cy (y c)
|
||||||
|
:r (dist c r)})])
|
|
@ -0,0 +1,57 @@
|
||||||
|
(ns core
|
||||||
|
(:require
|
||||||
|
[reagent.core :as r]
|
||||||
|
[components :as c]
|
||||||
|
[geometry :as g]))
|
||||||
|
|
||||||
|
(enable-console-print!)
|
||||||
|
|
||||||
|
;; "Global" mouse events
|
||||||
|
(def mouse-info
|
||||||
|
(r/atom {:x 0
|
||||||
|
:y 0
|
||||||
|
:mouse-down? false}))
|
||||||
|
|
||||||
|
(defn on-mouse-move [evt]
|
||||||
|
(swap! mouse-info assoc :x (.-clientX evt) :y (.-clientY evt)))
|
||||||
|
|
||||||
|
(defn on-mouse-up [evt]
|
||||||
|
(swap! mouse-info assoc :mouse-down? false))
|
||||||
|
|
||||||
|
(defn on-mouse-down [evt]
|
||||||
|
(swap! mouse-info assoc :mouse-down? true))
|
||||||
|
|
||||||
|
(def p1 (r/atom (g/point 100 100)))
|
||||||
|
(def p2 (r/atom (g/point 200 200)))
|
||||||
|
(def p3 (r/atom (g/point 100 200)))
|
||||||
|
(def c (r/atom (g/point 250 250)))
|
||||||
|
(def p (r/atom (g/point 250 300)))
|
||||||
|
|
||||||
|
(defn root []
|
||||||
|
[:g
|
||||||
|
[c/triangle @p1 @p2 @p3]
|
||||||
|
[c/circle @p @c]
|
||||||
|
[c/segment @p @c]
|
||||||
|
[c/draggable-point c mouse-info]
|
||||||
|
[c/draggable-point p mouse-info]
|
||||||
|
[c/draggable-point p1 mouse-info]
|
||||||
|
[c/draggable-point p2 mouse-info]
|
||||||
|
[c/draggable-point p3 mouse-info]])
|
||||||
|
|
||||||
|
(defn by-id [id]
|
||||||
|
(.getElementById js/document id))
|
||||||
|
|
||||||
|
(defn ^:export run []
|
||||||
|
(r/render-component
|
||||||
|
[:svg {:on-mouse-down on-mouse-down
|
||||||
|
:on-mouse-up on-mouse-up
|
||||||
|
:on-mouse-move on-mouse-move
|
||||||
|
:width 800
|
||||||
|
:height 600
|
||||||
|
:style {:border "1px solid black"}}
|
||||||
|
[:text {:style {:-webkit-user-select "none"
|
||||||
|
:-moz-user-select "none"}
|
||||||
|
:x 20 :y 20 :font-size 20}
|
||||||
|
"The points are draggable"]
|
||||||
|
[root]]
|
||||||
|
(by-id "app")))
|
|
@ -0,0 +1,18 @@
|
||||||
|
(ns geometry)
|
||||||
|
|
||||||
|
(defprotocol IPoint
|
||||||
|
(x [p])
|
||||||
|
(y [p]))
|
||||||
|
|
||||||
|
(deftype Point [x-coord y-coord]
|
||||||
|
IPoint
|
||||||
|
(x [_] x-coord)
|
||||||
|
(y [_] y-coord))
|
||||||
|
|
||||||
|
(defn point [x y]
|
||||||
|
(Point. x y))
|
||||||
|
|
||||||
|
(defn dist [p1 p2]
|
||||||
|
(js/Math.sqrt (+ (js/Math.pow (- (x p2) (x p1)) 2)
|
||||||
|
(js/Math.pow (- (y p2) (y p1)) 2))))
|
||||||
|
|
Loading…
Reference in New Issue