     if listeners?
       l.apply(chart, args) for l in listeners
 
+  chart.showRuleAt = (t) ->
+    unless t?
+      parent.select(".rule").style("display", "none")
+    else
+      bands = parent.select("div.bands")
+      r = bands[0][0].getBoundingClientRect()
+      cr = bands.select("canvas")[0][0].getBoundingClientRect()
+      pos = tscale(t) + cr.left + Math.floor(stepWidth/2)
+      clip = "rect("+(r.top - 5)+"px,"+r.right+"px,"+Math.round(r.bottom)+"px,0px)"
+      parent.select(".rule")
+        .style("display", "block")
+        .style("clip", clip)
+        .style("left", pos + "px")
 
   colorsBetween = (start, end, numColors) ->
     scale = d3.scale.linear()

    .concat colorsBetween("#e5f5e0",d3.hcl("#00441b").darker(), numBands)  # positive


  width = bandWidth
  height = bandHeight
  tscale = d3.time.scale().range([0, width])

  chart.useLog10BandSplitting = (_) -> if (!arguments.length) then useLog10Bands else useLog10Bands = _; chart
  chart.showLegend = (_) -> if (!arguments.length) then showLegend else showLegend = _; chart

  # Supported events: "applyFilter", "ruleMoved"
  chart.on = (eventName, listener) -> 
    (eventListeners[eventName] ?= []).push(listener); chart

