                     :backgroundColor "lightgray"}}
    "Collapse all"])
 
+(defn NilText []
+  [:span {:style (:nil styles)} (pr-str nil)])
+
+(defn StringText [data]
+  [:span {:style (:strings styles)} (pr-str data)])
+
+(defn KeywordText [data]
+  [:span {:style (:keywords styles)} (str data)])
+
+(defn NumberText [data]
+  [:span {:style (:numbers styles)} data])
+
 (defn Node [{:keys [data path emit-fn swappable]}]
   [:div (cond
           (nil? data)
-          [:span {:style (:nil styles)} (pr-str data)]
+          [NilText]
 
           (string? data)
           (if swappable

                     :on-change
                     (fn number-changed [e]
                       (emit-fn :changed path (js/Number (.. e -target -value))))}]
            [:span {:style (:numbers styles)} data])
          :else
          (str data))])


        (str (count data) " items"))
      [:span "}"]]]))

(defn KeySet [keyset]
  [:span
   (->> (map-indexed
          (fn [i data] ^{:key i} [:span
                                  (cond (nil? data) [NilText]
                                        (string? data) [StringText data]
                                        (keyword? data) [KeywordText data]
                                        (number? data) [NumberText data]
                                        :else (str data))]) keyset)
        (interpose " "))])

(defn MapNode [{:keys [data path expanded-paths emit-fn] :as all}]
  (let [expanded? (get expanded-paths path)]
    [:div {:style {:display "flex"}}
