     (recur)))
 
 (defn- make-typeahead-state
-  [{:as args :keys [on-change rigid? data-source]}]
+  [{:as args :keys [on-change rigid? change-on-blur? data-source]}]
   (let [c-input (chan)]
     (assoc typeahead-state-initial
-           :data-source data-source     ;; FIXME does not work yet ... need to make it test in render if this value has changed since last render
+           :data-source data-source
+           :change-on-blur? change-on-blur?
            :on-change  on-change
            :rigid?     rigid?
            :c-input    c-input

           :width          width
           :height         height
           :placeholder    placeholder
           :on-change #(do (swap! state-atom assoc :input-text %)
                           (when-not (clojure.string/blank? %)
                             (put! c-input %)))
           :change-on-blur? false
           :attr {:on-key-down #(on-key-down state-atom %)}]
          (if (or (not-empty suggestions) waiting?)

   {:name :on-change         :required true                   :type "string -> nil"    :validate-fn fn?                :description [:span [:code ":change-on-blur?"] " controls when it is called. Passed a suggestion object (which come from ." [:code ":data-source"] ")"] }
   {:name :data-source       :required true                   :type "fn"               :validate-fn fn?                :description [:span [:code ":data-source"] " supplies suggestion objects. This can either accept a single string argument (the search term), or a string and a callback. For the first case, the fn should return a 2-element vector containing the search term and a collection of suggestion objects (which can be anything). For the second case, the fn should return nil, and eventually result in a call to the callback passing two arguments: the search query and a vector of suggestion objects."]}
   {:name :render-suggestion :required false                  :type "render fn"        :validate-fn fn?                :description "override the rendering of the suggestion items by passing a fn that returns hiccup forms. The fn will receive two arguments: the search term, and the suggestion object."}
   {:name :suggestion-to-string :required false               :type "suggestion -> string" :validate-fn fn?            :description "When a suggestion is chosen, the input-text value will be set to the result of calling this fn with the suggestion object."}
   {:name :rigid?            :required false :default true    :type "boolean | atom"                                   :description [:span "If "[:code "false"]" the user will be allowed to choose arbitrary text input rather than a suggestion from " [:code ":data-source"]". In this case, a String will be supplied in lieu of a suggestion object." ]}
   {:name :status            :required false                  :type "keyword"          :validate-fn input-status-type? :description [:span "validation status. " [:code "nil/omitted"] " for normal status or one of: " input-status-types-list]}
   {:name :status-icon?      :required false :default false   :type "boolean"                                          :description [:span "when true, display an icon to match " [:code ":status"] " (no icon for nil)"]}
