                   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 if I used
-                   ;; xact!, it would be.
+                   ;; 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))
           ]

                                       :min      0
                                       :max      (dec rows)
                                       :style    #js {:width "30px"}
                                       :onInput  (partial modify :end-row)}))
            (dom/label nil
                       "End Column: "
                       (dom/input #js {:type     "number"

                                       :min      0
                                       :max      (dec columns)
                                       :style    #js {:width "30px"}
                                       :onInput  (partial modify-int :start-col)}))))
        (when (= "path" analysis)
          (dom/div
            nil
