Refactor clojure demos.

This commit is contained in:
Oliver 2026-07-30 13:52:58 +01:00
parent 10041e2365
commit 4a5248ca6c
27 changed files with 301 additions and 365 deletions

View File

@ -0,0 +1,27 @@
{:paths ["src"]
:deps {org.clojure/core.async {:mvn/version "1.6.673"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
reagent/reagent {:mvn/version "1.1.1"}
tick/tick {:mvn/version "0.5.0"}
metosin/reitit {:mvn/version "0.5.18"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.4"}
datascript/datascript {:mvn/version "1.4.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha9"}
metosin/spec-tools {:mvn/version "0.10.6"}
promesa/promesa {:mvn/version "11.0.678"}
funcool/promesa {:mvn/version "11.0.678"}
org.babashka/sci {:mvn/version "0.15.56"}
org.babashka/sci.configs {:git/url "https://github.com/babashka/sci.configs.git"
:sha "a785be2090991bf99ddc1c8cb4923a7217f6e098"}
com.github.seancorfield/honeysql {:mvn/version "2.7.1425"}
olymk2/tachyon-reagent {:git/url "https://gitlab.com/olymk2/tachyon-reagent.git"
:sha "e422af7b41266f7bc90ab78a24fb93f32be61385"}
olymk2/cl-eorg {:git/url "https://gitlab.com/olymk2/cl-org.git"
:sha "13e57f11da75516844922fe28bfd6aa7692b7c34"}}
:aliases {:test {:extra-paths ["test"]
:extra-deps {}}}}

View File

@ -0,0 +1,16 @@
{
"name": "clojure-demos",
"version": "1.0.0",
"description": "Clojure demos base",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/legacy-modes": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/theme-one-dark": "^6.0.0",
"@codemirror/view": "^6.0.0",
"@nextjournal/lang-clojure": "^1.0.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"tarts": "^1.0.0"
}
}

View File

@ -126,9 +126,7 @@
<body>
<div id="app">loading here</div>
<script
src="/cljs-out/main_bundle.js"
type="application/javascript"
></script>
<script src="/js/base.js" type="application/javascript"></script>
<script src="/js/app.js" type="application/javascript"></script>
</body>
</html>

View File

@ -1,4 +1,4 @@
(ns com.oly.static-sites.core
(ns com.oly.static-sites.clojure-demos.core
(:require
["@codemirror/language" :refer [LanguageSupport StreamLanguage]]
["@codemirror/legacy-modes/mode/yaml" :refer [yaml]]
@ -12,12 +12,12 @@
[cl-eorg.html :as h :refer [body headers org->replacements]]
[cl-eorg.parser :as o :refer [parse]]
[cl-eorg.themes.tachyon :refer [tachyon-theme]]
[com.oly.static-sites.components
[com.oly.static-sites.clojure-demos.components
:refer [header-lvl1 header-lvl2 header-lvl3 notification]]
[com.oly.static-sites.helpers :refer [slugify]]
[com.oly.static-sites.state :refer [site-state]]
[com.oly.static-sites.tailwind-theme :refer [tailwind-theme]]
[clojure.data.xml :as xml]
[com.oly.static-sites.clojure-demos.helpers :refer [slugify]]
[com.oly.static-sites.clojure-demos.state :refer [site-state]]
[com.oly.static-sites.clojure-demos.tailwind-theme :refer [tailwind-theme]]
;; [clojure.data.xml :as xml]
[clojure.string :as str]
[honey.sql :as sql]
[promesa.core :as promesa]
@ -31,11 +31,12 @@
[sci.configs.funcool.promesa :as sci-promesa]
[sci.configs.reagent.reagent :as sci-reagent]
[sci.configs.tonsky.datascript :as sci-datascript]
[com.oly.static-sites.routes :refer [site-data routes]]
[com.oly.static-sites.sitemap :as sm #_#_:refer [spit-pwa-sitemap]]
[com.oly.static-sites.clojure-demos.routes :refer [site-data routes]]
[com.oly.static-sites.clojure-demos.sitemap :as sm #_#_:refer [spit-pwa-sitemap]]
[com.oly.static-sites.ui-tachyon.core :as ui]
[tick.core :as t]
(com.oly.static-sites.sci-init :refer [sci-ctx yaml-mode]))
#_(:require-macros [com.oly.static-sites.sitemap :as sm #_#_:refer [spit-pwa-sitemap]]))
(com.oly.static-sites.clojure-demos.sci-init :refer [sci-ctx yaml-mode]))
#_(:require-macros [com.oly.static-sites.clojure-demos.sitemap :as sm #_#_:refer [spit-pwa-sitemap]]))
(defn fetch-selected-text
@ -216,27 +217,15 @@
articles)])
;; form one component to render a nav link
(defn navbar-link [{:keys [href title text key] :or {text nil title nil}}]
[:a.link.m-2 {:key (or key href) :class "hover:text-grey-200" :href href :title title} text])
(defn navbar-link [opts]
(ui/navbar-link opts))
;; form one component to render a navbar
(defn navbar [links]
[:header.text-white.bg-zinc-900.p-6.pl-12.w-full
(into [:nav.uppercase.font-medium.text-sm] (mapv navbar-link links))]
#_[:header.bg-black-90.w-100.ph3.pv3.pv4-ns.ph4-m.ph5-l
(into [:nav.f6.fw6.ttu.tracked] (mapv navbar-link links))])
(ui/navbar links))
(defn footer []
[:footer.bg-zinc-800.text-slate-400.p-8.m-auto.w-full
[:div.m-auto {:class "w-4/5"}
[:a.hover:text-slate-200
{:target "_blank" :href "https://matrix.to/#/@oly:matrix.org"}
"Contact me"]]]
#_[:div
[:footer.bg-near-black.white-80.pv4.ph3.ph5-m.ph6-l.mid-gray.w-full
[:a.f6.dib.ph2.link.mid-gray.dim
{:target "_blank" :href "https://matrix.to/#/@oly:matrix.org"}
"Contact me"]]])
(ui/footer))
(def toc (partial contains? (into #{} (map keyword [:HEADER1 :HEADER2 :HEADER3 :HEADER4 :HEADER5 :HEADER6]))))
(def org-code (partial contains? (into #{} (map keyword [:SRC]))))
@ -279,7 +268,9 @@
:link (rfe/href :page {:page "reagent-demo"})
:img-src "https://raw.githubusercontent.com/reagent-project/reagent/master/logo/logo-text.png"}]}]])
(defn grouped-list [data]
(defn grouped-lists-page [data]
[articles
{:title (-> data :title)
:body (-> data :intro)
@ -291,23 +282,30 @@
:img-src (:icon-image demo)})
(-> data :demos))}])
(defn lists-page [data]
[articles
{:title (-> data :title)
:body (-> data :intro)
:articles
(mapv (fn fmt-map [demo]
{:title (:title demo)
:description (:description demo)
:link (rfe/href :page {:page (:page demo)})
:img-src (:icon-image demo)})
(-> data :demos))}])
(defn list-view [route]
(let [group (keyword (name (:name (:data route))))]
(if-let [page-data (-> site-data :pages group)]
(lists-page page-data)
[:div "Page not found"])))
(defn grouped-page [route]
(let [group (keyword (name (:name (:data route))))]
(if (vector? (-> site-data :pages group ))
(into [:div]
(mapv #(grouped-list %) (-> site-data :pages group)))
(grouped-list (-> site-data :pages group )))
#_[:<> [articles
{:title (-> site-data :pages group :title)
:body (-> site-data :pages group :intro)
:articles
(mapv (fn fmt-map [demo]
{:title (:title demo)
:description (:description demo)
:link (rfe/href :page {:page (:page demo)})
:img-src (:icon-image demo)})
(-> site-data :pages group :demos))}]]))
(mapv #(lists-page %) (-> site-data :pages group)))
(lists-page (-> site-data :pages group )))))
(defn default-page [route]
(let [demo-key (keyword (-> route :parameters :path :page))
@ -371,9 +369,11 @@
(case view
:homepage home-page
:grouped-page grouped-page
:grouped-lists grouped-lists-page
:list list-view
:default-page-header default-page-header
:about-page about-page
grouped-page))
lists-page))
;; top level component contains nav and adds in the select page into a containing element
;; we are adding in a style sheet but this will often be done in index.html
@ -432,7 +432,7 @@
;; Generate the sitemap at start, routes are stored as plain data in cljc files
;; this means cljs and clj can read and manipulate them
(sm/spit-pwa-sitemap
"resources/public/sitemap.xml"
"bases/clojure-demos/resources/public/sitemap.xml"
"https://clojure-demos.digitaloctave.com")
;; we defonce the startup so that hot reloading does not reinitialize the state of the site

View File

@ -0,0 +1,5 @@
(ns com.oly.static-sites.clojure-demos.interface
(:require [com.oly.static-sites.clojure-demos.routes :as routes]))
(def routes routes/routes)
(def site-data routes/site-data)

View File

@ -24,7 +24,14 @@
:page "clojureclr-basics"}
{:title "ClojureDart"
:description "Clojure for dart, use clojure to build apps using flutter"
:page "clojuredart-info"}]}
:page "clojuredart-info"}
{:title "LetGO"
:description "Clojure for go, use clojure to build apps using go runtime"
:page "clojureletgo-info"}
]
}
:dsl {:title "DSL's"
:key :dsl
:intro "A domain-specific language (DSL) is a language designed to be used for a specific task or domain, clojure has a rich set of DSL some popular DSL's are listed on this page with example's on usage. "
@ -114,23 +121,23 @@
["/terminology/"
{:name :terminology
:view :grouped-page}]
:view :list}]
["/dialects/"
{:name :dialects
:view :grouped-page}]
:view :list}]
["/examples/"
{:name :examples
:view :grouped-page}]
:view :list}]
["/devops/"
{:name :devops
:view :grouped-page}]
:view :list}]
["/dsl/"
{:name :dsl
:view :grouped-page}]
:view :list}]
["/about/"
{:name :about

View File

@ -1,5 +0,0 @@
(ns com.oly.static-sites.interface
(:require [com.oly.static-sites.routes :as routes]))
(def routes routes/routes)
(def site-data routes/site-data)

View File

@ -100,7 +100,7 @@
["/about"
{:name :about
:view #'about-page}]
["/book/{*path}"
#_["/book/{*path}"
{:name :book
:view 'book
:parameters {:path string?}}]
@ -135,8 +135,8 @@
(let [search (r/atom "")]
(fn [{:keys [sidebar body]}]
[:div.h-100.flex.items-stretch
#_[:div.dn.db-l.pa3.bg-blue {:style {:flex-basis "20rem" :flex-grow "1"}} sidebar]
#_[:div.ma3.pa3 {:style {:flex-basis "0" :flex-grow "999"}}
[:div.dn.db-l.pa3.bg-blue {:style {:flex-basis "20rem" :flex-grow "1"}} sidebar]
[:div.ma3.pa3 {:style {:flex-basis "0" :flex-grow "999"}}
[ui-search search]
body]])))
@ -163,6 +163,7 @@
active-search (r/cursor state [:search :active])
org-index (r/cursor state [:index])]
(fn [content]
[:<>
[:link {:rel "stylesheet" :href "https://unpkg.com/tachyons@4.12.0/css/tachyons.min.css"}]
[:link {:rel "stylesheet" :href "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.3/css/fontawesome.min.css"}]
@ -180,7 +181,8 @@
[article-list-author-media-flipped
"Articles"
(search-articles {:search @search})])
content]
content
]
:sidebar [:div
[profile-card {:name "Oly" :tagline "Earthling, Software Engineer" :img-src "/images/default/me.png"}]
[:ul.list.pl0.measure.center
@ -200,110 +202,6 @@
[:a.black.f3.link.hover-green
{:href (rfe/href :book {:path ""})} "Book test"]]]]}]]])))
(defn book-page [front back current-page page degrees callback]
[:div.outline.w-50.v-mid.absolute.center.bg-blue.r0
{:onMouseUp #(when (<= current-page page) (callback inc))
:style {:left "50%" :height "105px"
:backface-visibility "hidden"
:transform (str "rotate3D(0,1,0,"
degrees
#_(if (<= (+ 1 current-page) page)
0
180)
"deg")}}
[:div.w-100.h-100.absolute.bg-green
{:onMouseUp #(when (> current-page page) (callback dec))
:style {:backface-visibility "hidden"
:transform
(str "rotate3D(0,1,0,"
180
"deg")}}
(+ 1 page)
"-" degrees "-"
back]
page "-" degrees "-" front])
(defn rotate-test
[]
(let [current-page (r/atom 1)
flick (fn [dir] (prn dir)
(swap! current-page dir))
pages (vec (search-articles {}))
p (r/track! (fn []
(prn @current-page)
(prn (- @current-page 1))
(prn (+ 4 @current-page))
(subvec pages 0 4 #_#_(- @current-page 1) (+ 4 @current-page))))]
(fn []
[:div
(str (count pages))
(str (nth @p 1))
(str @current-page)
[:div.flex.relative.center
[:<>
[book-page
(:title (nth @p 2))
(:title (nth @p 3))
@current-page 3
(if (<= (* 180 (- @current-page 2)) 0) 0 (* 180 (- @current-page 2)))
flick]
[book-page
(:title (first @p))
(:title (second @p))
@current-page 1
(* 180 (- 1 @current-page))
flick]]]
@current-page])))
;(partition 4 [1 2 3 4 5 6 7 8 9 10])
;(mod 360 180)
(defn book-pages
[& pages]
(let [current-page (r/atom 0)
flick (fn [idx dir] (swap! current-page dir))]
(fn [pages]
[:div.flex.relative.center @current-page
(doall
(->> pages
(map-indexed (fn [idx page] [(+ 1 idx) page]))
(reverse)
;(partition 4)
;(first)
(map (fn [[idx page]]
[:<> {:key idx}
[:div.outline.w-50.v-mid.absolute.center.bg-blue
{:onMouseUp #(flick idx inc)
:class (when (>= @current-page idx) "r0")
:style {:left "50%" :height "1050px"
:transform (if (< idx @current-page)
;(str "rotate3D(0,1,0,360deg)")
(str "rotate3D(0,1,0," (* @current-page 180) "deg)")
(str "rotate3D(0,1,0," (* @current-page 180) "deg)")
;(str "rotate3D(0,1,0," (* (- 1 idx) 180) "deg)")
)
:z-index (if (> idx @current-page) "1" "0")}}
[:div (when (= idx (+ 1 @current-page)) {:style {:transform "rotateY(180deg)"}}) "back page"
idx
page]]]))))])))
(defn book [{:keys [path-params] :as route}]
(let [document (r/cursor state [:document :hiccup])]
(fn [{:keys [path-params] :as route}]
[:<>
[rotate-test]
#_[book-pages
(mapv (fn [article] [:div.p1 (str article)
[title-text-image {:title article
:content (into [:div]
(vec
(rest
@doc)))}
(:details @document)]]) (search-articles {}))]])))
(defn ^:dev/after-load reagent-render [hiccup]
(swap! state update :refresh inc)
(dom/render [hiccup] (js/document.getElementById "app")))
@ -315,33 +213,25 @@
;; load in the latest document
(fn []
@update
(prn "render")
(swap! state assoc :search {:active false})
(swap! state assoc :search {:active false})
(when (-> @current-page :data :init)
((-> @current-page :data :init) nil)
((-> @current-page :data :init) (-> @current-page :parameters :path :path)))
(when (-> @current-page :data :state)
((-> @current-page :data :state) (-> @current-page :parameters :path :path)))
[layout [(-> @current-page :data :view) (-> @current-page)]]
#_(case (-> @current-page :data :name)
:homepage [layout [page-homepage @current-page]]
:archive [layout [archive @current-page]]
:posts [layout [post @current-page]]
:book [layout [book @current-page]]
:about [layout [about-page @current-page]]
[layout [:div "default"]]))))
[layout [(-> @current-page :data :view) (-> @current-page)]])))
(defn init []
(rfe/start!
router
(fn [m]
(swap! state assoc :current-route m)
;;(switch-to-latest (-> @state :current-route :parameters :path :path))
(prn m)
(swap! state assoc
:current-route m)
(switch-to-latest (-> @state :current-route :parameters :path :path))
)
{:use-fragment false})
(prn "init")
(GET "/documents/org-meta-index.edn"
{:handler (fn [response]
(->> (reader/read-string response)
@ -355,11 +245,6 @@
(select-initial-page (-> @state :current-route :parameters :path :path)))})
(reagent-render render-page))
;;(defonce start (init))
;;(comment )
;; (-> @state :document)
;; (latest-article)

View File

@ -53,13 +53,12 @@
(defn line-step
"Given if the move to the next position is valid"
[board size step x1 y1 x2 y2 cords]
(prn "1")
(if (outside-grid-edge? size x2 y2) #_(and
(piece-at-destination? [x1 y1] [x2 y2] board))
(do (prn "2") (conj cords nil))
(do (conj cords nil))
(if (opposite-piece? [x1 y1] [x2 y2] board)
(do (prn "4") (conj cords nil))
(do (prn "3") (conj cords [step x2 y2]))
(do (conj cords nil))
(do (conj cords [step x2 y2]))
)))
@ -68,7 +67,6 @@
We can abstract this because all that change's is which axes we calculate on
Just adjust the x1-fn x2-fn y1-fn y2-fn fn's"
[[x y] size x1-fn y1-fn x2-fn y2-fn board]
(prn "move")
(loop [step 1
cords-set-one []
cords-set-two []]
@ -106,7 +104,7 @@
[[x y] size board] (line-move [x y] size + - - + board))
(defn line-projection [[x y] size board]
(concat (line-horizontal [x y] size board)
(concat (drop-last (line-horizontal [x y] size board))
(line-vertical [x y] size board)))
(defn diagonal-projection [[x y] size board]

View File

@ -20,8 +20,7 @@
moveable-square "O "
:else (if (= (calculate-black-white pos) :black)
black-square
white-square
)))
white-square)))
(assoc :colour (if (= square :black)
white-square
black-square)

View File

@ -15,100 +15,6 @@
;;/addwidget https://blog-test.digitaloctave.com/chess?roomI=!YOyzcCyoomnjylcOFP:matrix.org&widgetId=dochess
(def widget (atom {}))
(defn send-to-parent
([action]
(prn (str "sending " action))
(.postMessage
js/window.parent
#js {:api "fromWidget",
:v "1.0"
:widgetId (:widget-id @widget)
:action action}, "*"))
([action data]
(prn (str "sending d " action))
(.postMessage
js/window.parent
#js {:api "fromWidget",
:v "1.0"
:action action
:widgetId (:widget-id @widget)
:requestId "request1"
:data data}, "*"))
([action hm-key data]
(prn (str "sending kv " action))
(prn (clj->js {:api "fromWidget",
:v "1.0"
:action action
:widgetId (:widget-id @widget)
(keyword hm-key) data
}))
(.postMessage
js/window.parent
(clj->js {:api "fromWidget",
:v "1.0"
:action action
:widgetId @widget
(keyword hm-key) data
}), "*"))
)
(defn site-startup []
(prn "site start up")
;; experiment in matrix widget api
#_(.addEventListener js/window "message"
(fn [event]
(prn "message from element ")
(.log js/console event)
(.log js/console (.-data event))
(prn (aget event "data" "api"))
(prn (aget event "data" "action"))
(prn (aget event "data" "widgetId"))
(when (= (aget event "data" "api") "toWidget")
(prn (str "msg type " (aget event "data" "action") ))
(case (aget event "data" "action")
"m.room.message" (prn "type msg")
"m.room.member" (prn "type member")
"capabilities"
(do
(prn "sending capabilities")
(swap! widget assoc :widget-id (aget event "data" "widgetId"))
(send-to-parent "capabilities" :capabilities #js ["m.capability.screenshot"]))
"notify_capabilities"
(do
(send-to-parent "capabilities" :capabilities #js ["m.capability.screenshot"]))
(do
(prn "unhandled action " (str (aget event "data" "action")))
(prn (aget event "data"))))
#_(prn (.-origin event))
#_(prn (.-data event)))))
(send-to-parent "ready")
(send-to-parent "widget_ready")
(send-to-parent "m.room.message" #js {:body "testing from widget" :msgtype "m.text"})
#_(.postMessage js/window.parent #js {:api "fromWidget",
:v "1.0"
:action "ready"
#_#_:action "supported_api_versions"}, "*")
#_(.postMessage js/window.parent #js {:api "fromWidget",
:v "1.0"
:action "content_loaded"
#_#_:action "supported_api_versions"}, "*")
#_(prn "send capability message")
#_(.postMessage js/window.parent #js {:api "fromWidget",
:v "1.0"
:action "capabilities"
:capabilities #js []
#_#_:action "supported_api_versions"}, "*")
)
#_(def game-state-viking (r/atom {:board viking-start-state}))
@ -126,15 +32,6 @@
results))))
(defn setup []
(prn "register listener")
(.addEventListener js/window "load"
(fn [event]
(prn "on load")
(site-startup))))
(defonce test-event (setup))
(defn get-square [board-state pos]
(get @board-state [:board pos] {}))
@ -163,7 +60,6 @@
(defn highlight-moves
([pos] (highlight-moves pos game-state))
([pos board-state]
(prn "highlight moves")
(->> (fetch-selected-piece-moves
(first (filter (fn [[k v]] (:selected v)) (-> @board-state :board)))
(-> @board-state :board))
@ -182,14 +78,17 @@
8 (str " bg-green-800 "))
:pos [x y]}))))))
(defn clear-keys [key]
(swap! game-state
assoc :board
(reduce-kv (fn [m pos piece]
(assoc m pos (dissoc piece key))) {} (-> @game-state :board))))
(defn clear-keys
([key] (clear-keys game-state key))
([board-state key]
(swap! board-state
assoc :board
(reduce-kv (fn [m pos piece]
(assoc m pos (dissoc piece key))) {}
(-> @board-state :board)))))
(defn get-selected-square []
(last (filter (fn [[_ square]] (true? (:selected square))) (-> @game-state :board))))
(defn get-selected-square [board-state]
(last (filter (fn [[_ square]] (true? (:selected square))) (-> @board-state :board))))
(defn piece-attribute-match?
[src-piece dest-piece attrib]
@ -225,7 +124,6 @@
nil
(when
(valid-move? (:pos dest-square) (-> @board-state :board))
(prn "--------------")
(switch-player)
(when (take-piece? selected-piece dest-square)
(prn (str "taking " dest-square))
@ -243,18 +141,16 @@
(defn click-square
([evt p] (click-square game-state evt p))
([board-state evt p]
(prn @game-state)
(let [[selected-pos {selected-piece :piece}] (get-selected-square)
(let [[selected-pos {selected-piece :piece}] (get-selected-square board-state)
clicked-square p]
(prn "click square")
(clear-keys :highlight)
(prn "click square" p)
(clear-keys board-state :highlight)
(when (piece-attribute-match? (current-player) selected-piece :colour)
(when selected-pos
(prn "previously selected piece")
(move-piece board-state selected-piece clicked-square)))
(clear-keys :selected)
(clear-keys :highlight)
(clear-keys board-state :selected)
(clear-keys board-state :highlight)
;; set new square as selected
(update-square board-state (:pos p) (assoc (get-square board-state (:pos p)) :selected true))
(highlight-moves (:pos p) board-state))))
@ -289,10 +185,9 @@
(if (:pieces query-params)
(chess-board-setup (chars->map (:pieces query-params)))
(chess-board-setup start-state))
(fn [{:keys [path-params] :as route}]
[:div
(let [[pos piece] (get-selected-square)]
(let [[pos piece] (get-selected-square game-state)]
[:div
[:div (str @widget)]
[:div (if (-> @game-state :player-one :selected)
@ -312,10 +207,9 @@
[:div (board 11 (-> @v/game-state :board))]]))
(comment
(board-test 5)
(board 5 (-> @game-state :board))
(get-selected-square)
(get-selected-square game-state)
@game-state)

View File

@ -31,8 +31,6 @@
[?e :relative-path ?path]]})
(defn check-match [re-patt title]
(prn re-patt)
(prn title)
(re-find re-patt title))
(defn db-search-filter
@ -47,7 +45,6 @@
(update-in [:where] #(conj % [`(~'re-find ~re-search ~'?title)])))))
(defn search-articles [search]
(prn (db-search-filter search))
(->>
(d/q (db-search-filter search) @conn)
(flatten)

View File

@ -0,0 +1,59 @@
(ns com.oly.static-sites.portfolio.clojure-demos-scenes
(:require [portfolio.dumdom :as d]
[com.oly.static-sites.ui-tachyon.core :as ui]))
(d/defscene navbar-scene
(ui/navbar [{:href "/" :text "Home"}
{:href "/dialects" :text "Dialects"}
{:href "/dsl" :text "DSLs"}
{:href "/examples" :text "Examples"}
{:href "/about" :text "About"}]))
(d/defscene footer-scene
ui/footer)
(d/defscene article-card-scene
(ui/article-card
{:title "Clojure Basics"
:description "Getting started with clojure syntax"
:img-src "https://clojure.org/images/clojure-logo-120b.png"}))
(d/defscene articles-list-scene
(ui/articles-list
{:title "Clojure Demos"
:articles [{:title "Clojure Basics"
:description "Getting started with clojure syntax datatype's sequences conditions"
:img-src "https://clojure.org/images/clojure-logo-120b.png"}
{:title "Reagent Demo"
:description "React application using reagent"
:img-src "https://raw.githubusercontent.com/reagent-project/reagent/master/logo/logo-text.png"}
{:title "Honey SQL Demo"
:description "Build SQL queries with Clojure data structures"
:img-src "https://miro.medium.com/max/1400/1*CEYFj5R57UFyCXts2nsBqA.png"}]}))
(d/defscene notification-scene
ui/notification)
(d/defscene header-with-link-scene
(ui/header-with-link "Example Header" 1))
(d/defscene grouped-articles-list-scene
(ui/grouped-articles-list
{:title "Clojure Demos"
:groups [{:title "Dialects & Interop"
:articles [{:title "Clojure"
:description "The original language running on the jvm with access to the java eco system"
:img-src "https://clojure.org/images/clojure-logo-120b.png"}
{:title "Clojurescript"
:description "Clojure running in the browser or on top of node, with access to the js eco system."
:img-src "https://clojurescript.org/images/cljs-logo-60b.png"}]}
{:title "DSL's"
:articles [{:title "Hiccup HTML Demo"
:description "Hiccup is a DSL for generating HTML it uses data structures over strings to generate html"
:icon-image "https://miro.medium.com/max/1400/1*CEYFj5R57UFyCXts2nsBqA.png"}
{:title "Honey SQL Demo"
:description "Similar to honey but for SQL allows you to split apart your complex queries into parts and compose them together."
:icon-image "https://miro.medium.com/max/1400/1*CEYFj5R57UFyCXts2nsBqA.png"}]}]}))
(d/defscene full-page-scene
ui/full-page)

View File

@ -1,6 +1,7 @@
(ns com.oly.static-sites.portfolio.core
(:require [dumdom.core :as dumdom]
[com.oly.static-sites.portfolio.page :as c]))
[com.oly.static-sites.portfolio.page :as c]
[com.oly.static-sites.portfolio.clojure-demos-scenes]))
(defn launch
"Site entry point"

View File

@ -1,9 +1,10 @@
{:paths ["development/src" "bases/portfolio/src" "bases/do-blog/src"]
{:mvn/repos {"clojars" {:url "https://repo.clojars.org/"}}
:paths ["development/src" "bases/portfolio/src" "bases/do-blog/src" "components/ui-tachyon/src"]
:deps {cjohansen/dumdom {:mvn/version "2023.11.06"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
no.cjohansen/portfolio {:mvn/version "2026.03.1"}}
:aliases {:dev {:extra-paths ["development/src" "bases/portfolio/src" "bases/do-blog/src"]
:extra-deps {org.clojure/clojure {:mvn/version "1.10.3"}
:extra-deps {org.clojure/clojure {:mvn/version "1.12.0"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
org.clojure/tools.deps.alpha {:mvn/version "0.12.1003"}
@ -17,34 +18,64 @@
no.cjohansen/portfolio {:mvn/version "2026.03.1"}
djblue/portal {:mvn/version "0.48.0"}}}
:blog {:extra-paths ["components/ui-hiccup/src"
"development/src" "bases/do-blog/src"
"bases/do-blog/test"]
:extra-deps {
org.clojure/core.async {:mvn/version "1.6.673"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
:blog {:extra-paths ["components/ui-hiccup/src"
"components/ui-tachyon/src"
"development/src" "bases/do-blog/src"
"bases/do-blog/test"]
:extra-deps {
org.clojure/core.async {:mvn/version "1.6.673"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
reagent/reagent {:mvn/version "1.1.1"}
tick/tick {:mvn/version "0.5.0"}
metosin/reitit {:mvn/version "0.5.18"}
reagent/reagent {:mvn/version "1.1.1"}
tick/tick {:mvn/version "0.5.0"}
metosin/reitit {:mvn/version "0.5.18"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.4"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.4"}
datascript/datascript {:mvn/version "1.4.0"}
olymk2/tachyon-reagent {:git/url "https://gitlab.com/olymk2/tachyon-reagent.git"
:sha "e422af7b41266f7bc90ab78a24fb93f32be61385"}
olymk2/cl-eorg {:git/url "https://gitlab.com/olymk2/cl-org.git"
:sha "13e57f11da75516844922fe28bfd6aa7692b7c34"}
}
}
datascript/datascript {:mvn/version "1.4.0"}
olymk2/tachyon-reagent {:git/url "https://gitlab.com/olymk2/tachyon-reagent.git"
:sha "e422af7b41266f7bc90ab78a24fb93f32be61385"}
olymk2/cl-eorg {:git/url "https://gitlab.com/olymk2/cl-org.git"
:sha "13e57f11da75516844922fe28bfd6aa7692b7c34"}
}
}
:clojure-demos {:extra-paths ["development/src"
"bases/clojure-demos/src"
"components/ui-tachyon/src"]
:extra-deps {
org.clojure/core.async {:mvn/version "1.6.673"}
org.clojure/clojurescript {:mvn/version "1.12.134"}
reagent/reagent {:mvn/version "1.1.1"}
tick/tick {:mvn/version "0.5.0"}
metosin/reitit {:mvn/version "0.5.18"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.4"}
datascript/datascript {:mvn/version "1.4.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha9"}
metosin/spec-tools {:mvn/version "0.10.6"}
funcool/promesa {:mvn/version "11.0.678"}
org.babashka/sci {:mvn/version "0.15.56"}
org.babashka/sci.configs {:git/url "https://github.com/babashka/sci.configs.git"
:sha "a785be2090991bf99ddc1c8cb4923a7217f6e098"}
com.github.seancorfield/honeysql {:mvn/version "2.7.1425"}
olymk2/tachyon-reagent {:git/url "https://gitlab.com/olymk2/tachyon-reagent.git"
:sha "e422af7b41266f7bc90ab78a24fb93f32be61385"}
olymk2/cl-eorg {:git/url "https://gitlab.com/olymk2/cl-org.git"
:sha "13e57f11da75516844922fe28bfd6aa7692b7c34"}
}
}
:shadow-cljs-run
{:extra-deps {thheller/shadow-cljs {:mvn/version "3.3.6"}
cider/cider-nrepl {:mvn/version "0.58.0"}
refactor-nrepl/refactor-nrepl {:mvn/version "3.11.0"}
cider/piggieback {:mvn/version "0.5.3"}}
:extra-paths ["dev" "bases/do-blog/src" "components/ui_hiccup/src"]
:shadow-cljs-run
{:extra-deps {thheller/shadow-cljs {:mvn/version "3.3.6"}
cider/cider-nrepl {:mvn/version "0.58.0"}
refactor-nrepl/refactor-nrepl {:mvn/version "3.11.0"}
cider/piggieback {:mvn/version "0.5.3"}}
:extra-paths ["bases/do-blog/src" "bases/clojure-demos/src" "components/ui-hiccup/src" "components/ui-tachyon/src"]
:main-opts ["-m" "shadow.cljs.devtools.cli"]}
:test {:extra-paths []}

View File

@ -2,7 +2,7 @@
(:require [portfolio.ui :as ui]
[portfolio.dumdom :as d]
[portfolio.dom :as r]
[blog.chess-scene :as chess]
[blog.chess-scenes :as chess]
[com.oly.static-sites.portfolio.page :as c]))
(d/defscene circle-flow

View File

@ -3,6 +3,9 @@
"version": "1.0.0",
"description": "",
"main": "main.js",
"workspaces": [
"bases/*"
],
"directories": {
"test": "test"
},
@ -25,8 +28,8 @@
"@sentry/react": "^6.19.7",
"@sentry/tracing": "^6.19.7",
"axe-core": "4.7.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"snabbdom": "3.5.1"
}
}

View File

@ -12,3 +12,12 @@ docker build -t europe-west2-docker.pkg.dev/blog-9d51d/blog/caddy .
docker push europe-west2-docker.pkg.dev/blog-9d51d/blog/caddy
clj -M:blog:shadow-cljs-run watch app ui blog blog-tests
* Clojure demos
#+BEGIN_SRC shell
clj -M:clojure-demos:shadow-cljs-run watch clojure-demos
#+END_SRC

View File

@ -1,6 +1,8 @@
{:deps {:aliases [:blog]}
{:deps {:aliases [:blog :clojure-demos]}
:dev-http {8080 ["bases/do-blog/resources/public" "classpath:public"]
8081 ["development/resources/public/" "classpath:public"]}
8082 ["bases/clojure-demos/resources/public" "classpath:public"]
8081 ["development/resources/public/" "classpath:public"]
}
;:nrepl {:middleware [refactor-nrepl.middleware/wrap-refactor]}
;;:nrepl {:middleware [refactor-nrepl.middleware/wrap-refactor]}
;; :source ["devlopment/src" "bases/portfolio/src"] ;;"src"
@ -19,7 +21,6 @@
"https://unpkg.com/tachyons@4.12.0/css/tachyons.min.css"]}
:html-file {
:path "development/resources/public/portfolio.html"}
:compiler-options {:infer-externs :auto :output-feature-set :es6}
;; :modules {:base {:entries [com.oly.static-sites.portfolio.core]}
;; ;; :app {:init-fn com.oly.static-sites.portfolio.core/launch
@ -28,18 +29,16 @@
;; ;; :portfolio {;;:init-fn design/launch
;; ;; :depends-on #{:app}}
;; }
:devtools {:after-load app.main/reload!}}
:app {:output-dir "development/resources/public/js"
;:asset-path "."
:target :browser
:compiler-options {:infer-externs :auto :output-feature-set :es6}
:modules {:base {:entries []}
:app {:init-fn com.oly.static-sites.portfolio.core/launch
:depends-on #{:base}}
:portfolio {:init-fn design/launch
:depends-on #{:base}}
}
:devtools {:after-load app.main/reload!}}
}
;; :app {:output-dir "development/resources/public/js"
;; ;:asset-path "."
;; :target :browser
;; :compiler-options {:infer-externs :auto :output-feature-set :es6}
;; :modules {:base {:entries []}
;; :app {:init-fn com.oly.static-sites.portfolio.core/launch
;; :depends-on #{:base}}
;; }
;; :devtools {:after-load app.main/reload!}}
:blog {:output-dir "bases/do-blog/resources/public/js"
;:asset-path "."
:target :browser
@ -48,8 +47,19 @@
:app {:init-fn com.oly.static-sites.do-blog.core/init
:depends-on #{:base}}
}
:devtools {:after-load app.main/reload!}
}
:clojure-demos {:output-dir "bases/clojure-demos/resources/public/js"
;:asset-path "."
:target :browser
:compiler-options {:infer-externs :auto :output-feature-set :es6 :externs ["datascript/externs.js"]
:warnings {:undeclared-var false}}
:modules {:base {:entries []}
:app {:init-fn com.oly.static-sites.clojure-demos.core/startup!
:depends-on #{:base}}
}
}
:blog-tests {:target :browser-test
:test-dir "development/resources/public/test/"
:ns-regexp "-test$"

View File

@ -6,4 +6,6 @@
:auto-add false}
:tag-patterns {:stable "stable-*"
:release "v[0-9]*"}
:projects {"development" {:alias "dev"}}}
:projects {"development" {:alias "dev"}}
:components {"ui-tachyon" {:alias "ui-tachyon"}
"ui-hiccup" {:alias "ui-hiccup"}}}