layouts.lisp
1 (in-package :ami.admin) 2 3 (defun admin-layout (title body-fn) 4 (html 5 (:html 6 (:head 7 (:title title) 8 (:meta :charset "utf-8") 9 (:meta :name "viewport" :content "width=device-width, initial-scale=1") 10 (:link :rel "preconnect" :href "https://fonts.googleapis.com") 11 (:link :rel "preconnect" :href "https://fonts.gstatic.com" :crossorigin "true") 12 (:link :href "https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,100..900;1,100..900&display=swap" :rel "stylesheet") 13 (:script :src "/static/morphdom.js") 14 (:script :src "/static/htmx.min.js") 15 (:script :src "/static/hyperscript.min.js") 16 (:script :src "/static/ami.js") 17 (:script :src "https://unpkg.com/@phosphor-icons/web@2.0.3/src/index.js") 18 (:link :rel "stylesheet" :type "text/css" :blocking "render" :href "/static/ami.c.css") 19 (:link :id "base-css" :rel "stylesheet" :type "text/css" :blocking "render" :href "/static/ami.c.css") 20 (:link :rel "stylesheet" :type "text/css" :blocking "render" :href (format nil "/static/ami.c.css?t=~s" (local-time:now)))) 21 (:body 22 (:div 23 :class "flex h-screen overflow-scroll" 24 (render-aside) 25 (:div :id "content" :class "flex justify-center w-[100%]" 26 (funcall body-fn))))))) 27 28 29 (defun render-aside () 30 (let ((models (ami.modeling::model-space-models ami.modeling::*model-space*))) 31 (html 32 (:aside 33 :class "h-[100%] translate-x-0 -translate-x-full p-2.5 pt-14" 34 (:div :class "w-[100%] flex flex-col items-center" 35 (:h1 (:ruby "網" (:rt :class "text-sm" "あみ"))) 36 (:h2 "HOLI")) 37 (:nav :class "p-8" 38 (:ul 39 (dolist (mdef (mapcar (lambda (mname) (gethash mname models)) 40 (alexandria:hash-table-keys models))) 41 (:li 42 :hx-push-url "true" 43 :hx-swap "outerHTML" 44 :hx-target "#content" 45 :hx-select "#content" 46 (ami.modeling::name-as-string mdef)))))))))