diff --git a/bases/clojure-demos/deps.edn b/bases/clojure-demos/deps.edn new file mode 100644 index 0000000..b01c185 --- /dev/null +++ b/bases/clojure-demos/deps.edn @@ -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 {}}}} diff --git a/bases/clojure-demos/package.json b/bases/clojure-demos/package.json new file mode 100644 index 0000000..d42a4df --- /dev/null +++ b/bases/clojure-demos/package.json @@ -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" + } +} diff --git a/bases/clojure-demos/resources/public/index.html b/bases/clojure-demos/resources/public/index.html index 4224812..d965eb3 100644 --- a/bases/clojure-demos/resources/public/index.html +++ b/bases/clojure-demos/resources/public/index.html @@ -126,9 +126,7 @@
loading here
- + + diff --git a/bases/clojure-demos/src/com/oly/static_sites/components.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/components.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/components.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/components.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/core.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/core.cljs similarity index 89% rename from bases/clojure-demos/src/com/oly/static_sites/core.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/core.cljs index 8868229..f635ec1 100644 --- a/bases/clojure-demos/src/com/oly/static_sites/core.cljs +++ b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/core.cljs @@ -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))}]])) + (into [:div] + (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 diff --git a/bases/clojure-demos/src/com/oly/static_sites/helpers.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/helpers.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/helpers.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/helpers.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/interface.cljc b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/interface.cljc new file mode 100644 index 0000000..3f585e6 --- /dev/null +++ b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/interface.cljc @@ -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) diff --git a/bases/clojure-demos/src/com/oly/static_sites/routes.cljc b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/routes.cljc similarity index 94% rename from bases/clojure-demos/src/com/oly/static_sites/routes.cljc rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/routes.cljc index 3b8710b..900f39f 100644 --- a/bases/clojure-demos/src/com/oly/static_sites/routes.cljc +++ b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/routes.cljc @@ -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 diff --git a/bases/clojure-demos/src/com/oly/static_sites/sci_init.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sci_init.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/sci_init.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sci_init.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/sitemap.clj b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sitemap.clj similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/sitemap.clj rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sitemap.clj diff --git a/bases/clojure-demos/src/com/oly/static_sites/sitemap.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sitemap.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/sitemap.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/sitemap.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/state.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/state.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/state.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/state.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/tailwind_theme.cljs b/bases/clojure-demos/src/com/oly/static_sites/clojure_demos/tailwind_theme.cljs similarity index 100% rename from bases/clojure-demos/src/com/oly/static_sites/tailwind_theme.cljs rename to bases/clojure-demos/src/com/oly/static_sites/clojure_demos/tailwind_theme.cljs diff --git a/bases/clojure-demos/src/com/oly/static_sites/interface.cljc b/bases/clojure-demos/src/com/oly/static_sites/interface.cljc deleted file mode 100644 index 2e01727..0000000 --- a/bases/clojure-demos/src/com/oly/static_sites/interface.cljc +++ /dev/null @@ -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) diff --git a/bases/do-blog/src/com/oly/static_sites/do_blog/core.cljs b/bases/do-blog/src/com/oly/static_sites/do_blog/core.cljs index f0374c2..0cca8ca 100644 --- a/bases/do-blog/src/com/oly/static_sites/do_blog/core.cljs +++ b/bases/do-blog/src/com/oly/static_sites/do_blog/core.cljs @@ -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) diff --git a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/movement.cljs b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/movement.cljs index 2db9bd3..9b74dcb 100644 --- a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/movement.cljs +++ b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/movement.cljs @@ -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] diff --git a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/render.cljs b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/render.cljs index 0b7ce53..5fd60db 100644 --- a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/render.cljs +++ b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess/render.cljs @@ -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) diff --git a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess_board.cljs b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess_board.cljs index 70d2e17..8f5a8cc 100644 --- a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess_board.cljs +++ b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/chess_board.cljs @@ -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) diff --git a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/helpers/database.cljs b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/helpers/database.cljs index 5d7480a..e388ead 100644 --- a/bases/do-blog/src/com/oly/static_sites/do_blog/pages/helpers/database.cljs +++ b/bases/do-blog/src/com/oly/static_sites/do_blog/pages/helpers/database.cljs @@ -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) diff --git a/bases/portfolio/src/com/oly/static_sites/portfolio/clojure_demos_scenes.cljs b/bases/portfolio/src/com/oly/static_sites/portfolio/clojure_demos_scenes.cljs new file mode 100644 index 0000000..b23d167 --- /dev/null +++ b/bases/portfolio/src/com/oly/static_sites/portfolio/clojure_demos_scenes.cljs @@ -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) diff --git a/bases/portfolio/src/com/oly/static_sites/portfolio/core.cljs b/bases/portfolio/src/com/oly/static_sites/portfolio/core.cljs index d15a6f6..4dc193d 100644 --- a/bases/portfolio/src/com/oly/static_sites/portfolio/core.cljs +++ b/bases/portfolio/src/com/oly/static_sites/portfolio/core.cljs @@ -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" diff --git a/deps.edn b/deps.edn index fa9be97..098fe01 100644 --- a/deps.edn +++ b/deps.edn @@ -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 []} diff --git a/development/src/design.cljs b/development/src/design.cljs index 9519434..94de363 100644 --- a/development/src/design.cljs +++ b/development/src/design.cljs @@ -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 diff --git a/package.json b/package.json index 6361b41..0c8e4fc 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/readme.org b/readme.org index c871be2..aa8fe1c 100644 --- a/readme.org +++ b/readme.org @@ -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 + + diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 3045af7..a12914e 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -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$" diff --git a/workspace.edn b/workspace.edn index 17dcdf5..c79a0ef 100644 --- a/workspace.edn +++ b/workspace.edn @@ -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"}}}