All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 5m35s
- 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>
38 lines
1.7 KiB
Plaintext
38 lines
1.7 KiB
Plaintext
;; Newsletter management components
|
|
|
|
(defcomp ~account-newsletter-desc (&key description)
|
|
(when description
|
|
(p :class "text-xs text-stone-500 mt-0.5 truncate" description)))
|
|
|
|
(defcomp ~account-newsletter-toggle (&key id url hdrs target cls checked knob-cls)
|
|
(div :id id :class "flex items-center"
|
|
(button :sx-post url :sx-headers hdrs :sx-target target :sx-swap "outerHTML"
|
|
:class cls :role "switch" :aria-checked checked
|
|
(span :class knob-cls))))
|
|
|
|
(defcomp ~account-newsletter-toggle-off (&key id url hdrs target)
|
|
(div :id id :class "flex items-center"
|
|
(button :sx-post url :sx-headers hdrs :sx-target target :sx-swap "outerHTML"
|
|
:class "relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-emerald-500 focus:ring-offset-2 bg-stone-300"
|
|
:role "switch" :aria-checked "false"
|
|
(span :class "inline-block h-4 w-4 rounded-full bg-white shadow transform transition-transform translate-x-1"))))
|
|
|
|
(defcomp ~account-newsletter-item (&key name desc toggle)
|
|
(div :class "flex items-center justify-between py-4 first:pt-0 last:pb-0"
|
|
(div :class "min-w-0 flex-1"
|
|
(p :class "text-sm font-medium text-stone-800" name)
|
|
desc)
|
|
(div :class "ml-4 flex-shrink-0" toggle)))
|
|
|
|
(defcomp ~account-newsletter-list (&key items)
|
|
(div :class "divide-y divide-stone-100" items))
|
|
|
|
(defcomp ~account-newsletter-empty ()
|
|
(p :class "text-sm text-stone-500" "No newsletters available."))
|
|
|
|
(defcomp ~account-newsletters-panel (&key list)
|
|
(div :class "w-full max-w-3xl mx-auto px-4 py-6"
|
|
(div :class "bg-white/70 backdrop-blur rounded-2xl shadow border border-stone-200 p-6 sm:p-8 space-y-6"
|
|
(h1 :class "text-xl font-semibold tracking-tight" "Newsletters")
|
|
list)))
|