- Server sends sexp source text, client (sexp.js) renders everything - SexpExpr marker class for nested sexp composition in serialize() - sexp_page() HTML shell with data-mount="body" for full page loads - sexp_response() returns text/sexp for OOB/partial responses - ~app-body layout component replaces ~app-layout (no raw!) - ~rich-text is the only component using raw! (for CMS HTML content) - Fragment endpoints return text/sexp, auto-wrapped in SexpExpr - All _*_html() helpers converted to _*_sexp() returning sexp source - Head auto-hoist: sexp.js moves meta/title/link/script[ld+json] from rendered body to document.head automatically - Unknown components render warning box instead of crashing page - Component kwargs preserve AST for lazy rendering (fixes <> in kwargs) - Fix unterminated paren in events/sexp/tickets.sexpr Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
25 lines
970 B
Plaintext
25 lines
970 B
Plaintext
;; Blog header components
|
|
|
|
(defcomp ~blog-header-label ()
|
|
(div))
|
|
|
|
(defcomp ~blog-container-nav (&key container-nav)
|
|
(div :class "flex flex-col sm:flex-row sm:items-center gap-2 border-r border-stone-200 mr-2 sm:max-w-2xl"
|
|
:id "entries-calendars-nav-wrapper" container-nav))
|
|
|
|
(defcomp ~blog-admin-label ()
|
|
(<> (i :class "fa fa-shield-halved" :aria-hidden "true") " admin"))
|
|
|
|
(defcomp ~blog-admin-nav-item (&key href nav-btn-class label is-selected select-colours)
|
|
(div :class "relative nav-group"
|
|
(a :href href
|
|
:aria-selected (when is-selected "true")
|
|
:class (str (or nav-btn-class "justify-center cursor-pointer flex flex-row items-center gap-2 rounded bg-stone-200 text-black p-3") " " (or select-colours ""))
|
|
label)))
|
|
|
|
(defcomp ~blog-sub-settings-label (&key icon label)
|
|
(<> (i :class icon :aria-hidden "true") " " label))
|
|
|
|
(defcomp ~blog-sub-admin-label (&key icon label)
|
|
(<> (i :class icon :aria-hidden "true") (div label)))
|