        [:div.item.active {:class lr :style {:top top}} "Tweets: " v]
        [:div.dot.active {:style {:top top :border-color "steelblue"}}]])))
 
-(defn ts-chart []
-  (let [bars @bars
+(defn ts-chart
+  "Renders time series chart consisting of SVG for the bars and a label.
+   Appearance is similar to the Rickshaw timeseries chart, which this
+   component replaced, except for the CSS."
+  []
+  (let [bars @bars-atom
         indexed (vec (map-indexed vector bars))
         mx (apply max (map (fn [[k v]] v) bars))
         cnt (count bars)

            [reagent.core :as r :refer [atom]]
            [cljs.core.async :as async :refer [chan sub timeout sliding-buffer]]))

(enable-console-print!)

(def bars (atom []))
(def label (atom {}))

(def ts-elem (util/by-id "timeseries1"))
(def ts-w (aget ts-elem "offsetWidth"))
(def ts-h 100)

(defn bar [x y h w idx]
  [:rect {:x x :y (- y h) :fill "steelblue" :width w :height h
          :on-mouse-enter #(reset! label {:idx idx})
          :on-mouse-leave #(reset! label {})}])

(defn barchart [indexed mx cnt w]
  (let [gap (/ (/ ts-w 20) cnt)]
    [:svg {:width ts-w :height ts-h}
     [:g
      (for [[idx [k v]] indexed]
        ^{:key k} [bar (* idx w) ts-h (* (/ v mx) ts-h) (- w gap) idx])]]))

(defn labels [bars mx cnt w]
  (when-not (empty? @label)
    (let [idx (:idx @label)
          [k v] (get bars idx)

  (let [state-chan (chan (sliding-buffer 1))]
    (go-loop []
             (let [[_ state] (<! state-chan)]
               (reset! bars-atom (ts/ts-data state))
               (<! (timeout every-ms))
               (recur)))
    (sub state-pub :app-state state-chan)))
