Replace hardcoded hex color tokens with algorithmic color scales generated from HSL parameters. Each scale is defined by hue, saturation, and lightness steps in tokens.edn, then converted to hex via jon/color-tools. Color scales (gray, accent, danger, success, warning) generate 11 stops each (50–950) into :root. Semantic tokens (bg-0, fg-0, accent, etc.) reference scale variables with var(--gray-50), var(--accent-500), etc. Dark theme switches which stop each semantic token points to. Gray scale uses hue 240 with tapered saturation for a purplish tint matching the activity-tracker aesthetic. Accent is vivid purple (hue 252). Border radii bumped to 6/10/16px for a rounder feel. To shift the entire palette (e.g. warm gray), change hue/saturation in tokens.edn and run `bb build-theme`.
134 lines
5.9 KiB
Clojure
134 lines
5.9 KiB
Clojure
{:deps {com.github.jramosg/color-tools {:mvn/version "1.1.0"}}
|
|
:paths ["src" "test" "dev/hiccup/src"]
|
|
|
|
:tasks
|
|
{build-theme
|
|
{:doc "Generate dist/theme.css from tokens.edn and copy to dev targets"
|
|
:requires ([ui.css.gen :as gen]
|
|
[clojure.java.io :as io])
|
|
:task (do (gen/build-theme! {:input "src/theme/tokens.edn"
|
|
:output "dist/theme.css"})
|
|
(let [css (slurp "dist/theme.css")]
|
|
(spit "dev/replicant/public/theme.css" css)
|
|
(io/make-parents "dev/squint/public/theme.css")
|
|
(spit "dev/squint/public/theme.css" css)
|
|
(println "Copied theme.css to dev targets")))}
|
|
|
|
test
|
|
{:doc "Run all unit tests"
|
|
:requires ([clojure.test :as t]
|
|
[ui.button-test]
|
|
[ui.alert-test]
|
|
[ui.badge-test]
|
|
[ui.card-test]
|
|
[ui.accordion-test]
|
|
[ui.table-test]
|
|
[ui.dialog-test]
|
|
[ui.spinner-test]
|
|
[ui.skeleton-test]
|
|
[ui.progress-test]
|
|
[ui.switch-test]
|
|
[ui.tooltip-test]
|
|
[ui.breadcrumb-test]
|
|
[ui.pagination-test]
|
|
[ui.form-test]
|
|
[ui.icon-test]
|
|
[ui.sidebar-test]
|
|
[ui.theme-test])
|
|
:task (let [{:keys [fail error]} (t/run-tests
|
|
'ui.button-test
|
|
'ui.alert-test
|
|
'ui.badge-test
|
|
'ui.card-test
|
|
'ui.accordion-test
|
|
'ui.table-test
|
|
'ui.dialog-test
|
|
'ui.spinner-test
|
|
'ui.skeleton-test
|
|
'ui.progress-test
|
|
'ui.switch-test
|
|
'ui.tooltip-test
|
|
'ui.breadcrumb-test
|
|
'ui.pagination-test
|
|
'ui.form-test
|
|
'ui.icon-test
|
|
'ui.sidebar-test
|
|
'ui.theme-test)]
|
|
(when (pos? (+ fail error))
|
|
(System/exit 1)))}
|
|
|
|
ensure-npm
|
|
{:doc "Install node_modules in dev/replicant and dev/squint if missing"
|
|
:task (do
|
|
(when-not (.exists (clojure.java.io/file "dev/replicant/node_modules"))
|
|
(println "Installing node_modules in dev/replicant...")
|
|
(shell {:dir "dev/replicant"} "npm install"))
|
|
(when-not (.exists (clojure.java.io/file "dev/squint/node_modules"))
|
|
(println "Installing node_modules in dev/squint...")
|
|
(shell {:dir "dev/squint"} "npm install")))}
|
|
|
|
dev-hiccup
|
|
{:doc "Start hiccup dev server (--port PORT, default 3003)"
|
|
:depends [build-theme]
|
|
:requires ([dev.hiccup])
|
|
:task (let [port (or (some-> (System/getenv "PORT") parse-long) 3003)]
|
|
(dev.hiccup/start! {:port port})
|
|
(deref (promise)))}
|
|
|
|
dev-replicant
|
|
{:doc "Start replicant dev server (PORT env var, default 3001)"
|
|
:depends [build-theme ensure-npm]
|
|
:task (let [port (some-> (System/getenv "PORT") parse-long)
|
|
env (cond-> {} port (assoc "SHADOW_HTTP_PORT" (str port)))]
|
|
(shell {:dir "dev/replicant" :extra-env env}
|
|
"npx" "shadow-cljs" "watch" "app"))}
|
|
|
|
dev-squint
|
|
{:doc "Start squint dev server (PORT env var, default 3002)"
|
|
:depends [build-theme ensure-npm]
|
|
:task (let [port (or (some-> (System/getenv "PORT") parse-long) 3002)]
|
|
(shell {:dir "dev/squint"}
|
|
"bash" "-c" (str "npx squint watch & exec npx vite --port " port)))}
|
|
|
|
dev
|
|
{:doc "Start all dev servers"
|
|
:depends [build-theme]
|
|
:requires ([dev.hiccup])
|
|
:task (let [port (or (some-> (System/getenv "PORT") parse-long) 3003)]
|
|
(dev.hiccup/start! {:port port})
|
|
(println "Dev servers running:")
|
|
(println (str " Hiccup: http://localhost:" port))
|
|
(println " Replicant: cd dev/replicant && npx shadow-cljs watch app")
|
|
(println " Squint: cd dev/squint && npm run dev")
|
|
(println " Test page: dev/index.html")
|
|
(deref (promise)))}
|
|
|
|
check-dev
|
|
{:doc "Check all ui-dev tmux panes for errors and verify dev servers"
|
|
:task (load-file "scripts/check-dev.bb")}
|
|
|
|
dev-all
|
|
{:doc "Start all dev servers in tmux panes (bb dev-all [BASE_PORT], default 3000)"
|
|
:depends [build-theme ensure-npm]
|
|
:task (let [base (or (some-> (first *command-line-args*) parse-long) 3000)
|
|
rport (+ base 1)
|
|
sport (+ base 2)
|
|
hport (+ base 3)
|
|
session "ui-dev"]
|
|
(shell {:continue true} "tmux kill-session -t" session)
|
|
(shell "tmux new-session -d -s" session
|
|
(str "PORT=" hport " bb dev-hiccup"))
|
|
(shell "tmux split-window -h -t" session
|
|
(str "bash -c 'cd dev/replicant && SHADOW_HTTP_PORT=" rport " npx shadow-cljs watch app'"))
|
|
(shell "tmux split-window -v -t" session
|
|
(str "bash -c 'cd dev/squint && npx squint watch"
|
|
" & cd dev/squint && npx vite --port " sport "'"))
|
|
(shell "tmux select-layout -t" session "tiled")
|
|
(println (str "Tmux session 'ui-dev' created (base port " base "):"))
|
|
(println (str " Pane 0: Hiccup → http://localhost:" hport))
|
|
(println (str " Pane 1: Replicant → http://localhost:" rport))
|
|
(println (str " Pane 2: Squint → http://localhost:" sport))
|
|
(println)
|
|
(when-not (zero? (:exit (shell {:continue true} "tmux attach -t" session)))
|
|
(println "Attach with: tmux attach -t" session)))}}}
|