2023-09-01 13:44:27 +02:00
|
|
|
;;;; accordion.lisp
|
|
|
|
;;;;
|
|
|
|
;;;; This file defines a package for generating Bootstrap accordion components
|
2023-09-09 08:20:17 +02:00
|
|
|
;;;; using Common Lisp macros.
|
2023-07-11 15:59:52 +02:00
|
|
|
|
2023-12-18 11:34:54 +01:00
|
|
|
(defpackage dev.metalisp.sbt/component/accordion
|
2023-09-01 15:20:45 +02:00
|
|
|
(:documentation "A package for generating Bootstrap accordions.")
|
2023-07-11 15:59:52 +02:00
|
|
|
(:use :cl)
|
|
|
|
(:export
|
|
|
|
:accordion))
|
|
|
|
|
2023-12-18 11:34:54 +01:00
|
|
|
(in-package :dev.metalisp.sbt/component/accordion)
|
2023-07-11 15:59:52 +02:00
|
|
|
|
2024-02-03 20:57:11 +01:00
|
|
|
(defmacro accordion ((&key (id "accordionExample") flush) &body body)
|
2024-02-03 23:42:32 +01:00
|
|
|
"This macro generates an accordion-style collapsible list.
|
2024-02-03 18:56:58 +01:00
|
|
|
|
|
|
|
ID: Specifies a unique identifier for the accordion. Defaults to 'accordionExample'.
|
|
|
|
|
2024-02-03 23:42:32 +01:00
|
|
|
FLUSH: If t, adds class 'accordion-flush' to remove borders. Defaults to nil.
|
2024-02-03 20:57:11 +01:00
|
|
|
|
2024-02-03 23:42:32 +01:00
|
|
|
---
|
|
|
|
5 Scenarios to Avoid Them: https://www.nngroup.com/videos/avoid-accordions/
|
|
|
|
---
|
|
|
|
|
|
|
|
Example usage:
|
|
|
|
(accordion () (\"Title 1\" \"Content 1\") (\"Title 2\" \"Content 2\"))
|
|
|
|
(accordion (:id \"accordionExample\" :flush t) (\"Title 1\" \"Content 1\") (\"Title 2\" \"Content 2\"))"
|
2024-02-03 18:48:00 +01:00
|
|
|
(let ((class (concatenate 'string "accordion" (when flush " accordion-flush"))))
|
2024-02-03 18:53:45 +01:00
|
|
|
`(spinneret:with-html
|
|
|
|
(:div :class ,class
|
|
|
|
:id ,id
|
2024-02-03 23:42:32 +01:00
|
|
|
,@(loop for (title content) in body
|
|
|
|
for counter from 1
|
|
|
|
for collapse-id = (format nil "collapse-~a-~a" id counter)
|
2024-02-03 18:53:45 +01:00
|
|
|
collect `(:div :class "accordion-item"
|
2024-02-03 20:50:10 +01:00
|
|
|
(:h2 :class "accordion-header"
|
|
|
|
(:button :class "accordion-button"
|
|
|
|
:type "button"
|
|
|
|
:data-bs-toggle "collapse"
|
2024-02-03 23:42:32 +01:00
|
|
|
:data-bs-target ,(concatenate 'string "#" collapse-id)
|
2024-02-04 11:57:03 +01:00
|
|
|
:aria-expanded ,(if (= counter 1) "true" "false")
|
2024-02-03 23:42:32 +01:00
|
|
|
:aria-controls ,collapse-id
|
2024-02-03 20:50:10 +01:00
|
|
|
,title))
|
2024-02-03 23:42:32 +01:00
|
|
|
(:div :id ,collapse-id
|
|
|
|
:class "accordion-collapse collapse"
|
|
|
|
:data-bs-parent ,(concatenate 'string "#" id)
|
|
|
|
(:div :class "accordion-body"
|
|
|
|
,content))))))))
|