(ns ui.button (:require [clojure.string :as str] [ui.icon :as icon])) ;; In squint, keywords are strings — name is identity #?(:squint (defn- kw-name [s] s) :cljs (defn- kw-name [s] (name s)) :clj (defn- kw-name [s] (name s))) (def default-variant "secondary") (def default-size "md") (defn button-class-list "Generate a vector of CSS class strings for a button given variant, size, and icon mode. Returns e.g. [\"btn\" \"btn-primary\" \"btn-lg\"]. When :icon is provided (icon-only mode), adds \"btn-icon\"." [{:keys [variant size icon]}] (let [v (or (some-> variant kw-name) default-variant) s (or (some-> size kw-name) default-size)] (cond-> ["btn" (str "btn-" v)] (not= s "md") (conj (str "btn-" s)) icon (conj "btn-icon")))) (defn button-classes "Generate CSS class string for a button. Returns a space-joined string." [opts] (str/join " " (button-class-list opts))) (defn button "Render a button element. Works across all targets via reader conditionals. When :href is provided, renders as instead of