                                      :min      2
                                      :max      99
                                      :style    #js {:width "30px"}
-                                     :onInput  (partial modify :rows)}))
+                                     :onInput  (partial modify-int :rows)}))
           (dom/label nil
                      "Columns: "
                      (dom/input #js {:type     "number"

                                       :min      0
                                       :max      (dec columns)
                                       :style    #js {:width "30px"}
                                       :onInput  (partial modify :end-col)}))))
        (dom/div
          nil
          (dom/button #js {:id       "gobutton"

                  analysis start-row start-col end-row end-col]} params
          {:keys [active grid]} animation
          modify (fn [maze-param e]
                   ;; Note that the symbol doesn't need to be explicitly namespace-qualified here,
                   ;; but using xact! below, it has to be.
                   (om.next/transact! this `[(set-maze-param {:param ~maze-param :value ~(aget e "target" "value")})]))
          modify-int (fn [maze-param e]
                       (let [val (aget e "target" "value")]
                         (if (re-matches #"^\d+$" val)
                           (xact! this (snergly.core/set-maze-param
                                         {:param maze-param
                                          :value (js/parseInt val)})))))
          go-async (fn [maze e]
                     (protocols/start-animation (get-in maze [:animation :animator]) (:params maze) ui))
          ]
