;;;; views/components.lisp -- reusable components (in-package :dnd) ;;; LIST DATA (defrender :list ((data list) (class "listview") (item-class "listitem")) "A catch all for rendering lists of renderable data items as unordered lists. CLASS is the lass string for the containing list. ITEM-CLASS is the class string for the contained list items." (with-html (:ol :class class (dolist (item data) (:li :class item-class (render :list-item item)))))) (defrender :horiz-list ((data list) (class "hlistview") (item-class "listitem")) (with-html (:ol :class class (dolist (item data) (:li :class item-class (render :list-item item)))))) (defrender :select ((data list) (multiple "false") name class) (with-html (when data (:select :multiple multiple :name (or name (format nil "select-~a" (class-of (first data)))) :class (or class (format nil "select ~a" (class-of (first data)))) (dolist (item data) (render :option item)))))) (defrender :checkboxes ((data list) id class) (with-html (when data (:div :class (or class (format nil "checkboxes ~a" (class-of (first data)))) :id (or id (format nil "checkboxes-~a" (class-of (first data)))) (dolist (item data) (render :checkbox item) (:br)))))) ;;;; PAGE ELEMENTS (defun navbar () (with-html (:nav :class "navbar" :aria-label "Navigation" (:div :class "logo" :aria-label "DND logo" "DND") (:ul :class "nav-links" :aria-label "Nav links" (:li (:a :href "/hero" :aria-label "Hero profile" "🧝")) (:li (:a :href "/inventory" :aria-label "Inventory" "🎒")) (:li (:a :href "/quests" :aria-label "Quests" "📜")) (:li (:a :href "/tavern" :aria-label "Tavern" "🍺"))))))