From 641fa7479e355ece63349376bd48ad17f2bf17de Mon Sep 17 00:00:00 2001 From: Grant Shangreaux Date: Mon, 20 Feb 2023 12:03:17 -0600 Subject: WIP: sketches of clos pages with render defgeneric --- pages.lisp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/pages.lisp b/pages.lisp index c435e8f..5d2b41d 100644 --- a/pages.lisp +++ b/pages.lisp @@ -64,3 +64,61 @@ "the" (hero-class hero) (hero-title hero)))))) + +(defgeneric render (element) + (:documentation "Render an element as HTML")) + +(defclass page () + ((title + :reader title + :initarg :title + :documentation "Page title ") + (main + :reader main + :initarg :main + :initform "" + :documentation "Main content for a page."))) + +(defmethod render ((doc page)) + (with-html + (:doctype) + (:html + (:head (:title (title doc))) + (:body + (main doc))))) + +(defclass navable () + ((nav-links + :reader nav-links + :initarg :nav-links + :type list)) + (:documentation "Mixin for a PAGE class with navigation.")) + +(defclass nav-link () + ((target :initarg :target) + (text :initarg :text) + (icon :initarg :icon :initform nil) + (label :initarg :label :initform nil))) + +(defmethod render ((element nav-link)) + (with-slots (target icon label text) element + (with-html + (:li (:a :href target :aria-label label icon text))))) + +(defclass page-with-nav (page navable) + ()) + +(defmethod render ((doc page-with-nav)) + (with-html + (:doctype) + (:html + (:head (:title (title doc))) + (:body + (:nav (:ul (mapc #'render (nav-links doc)))) + (:main (main doc)))))) + +;; (let* ((link (make-instance +;; 'nav-link :target "/moo" :label "goo" :icon "🍺" :text "Tavern")) +;; (foo (make-instance +;; 'page-with-nav :title "goober" :main "Content" :nav-links (list link link)))) +;; (render foo)) -- cgit v1.2.3