(defcomp
  (&key
    (title :as string)
    (description :as string)
    (demo-description :as string?)
    demo
    (sx-code :as string)
    (sx-lang :as string?)
    (handler-names :as list)
    (handler-lang :as string?)
    (comp-placeholder-id :as string?)
    (wire-placeholder-id :as string?)
    (wire-note :as string?)
    (comp-heading :as string?)
    (handler-heading :as string?))
  (~docs/page
    :title title
    (p (~tw :tokens "text-stone-600 mb-6") description)
    (error-boundary
      (~examples/card
        :title "Demo"
        :description demo-description
        (~examples/demo demo)))
    (h3 (~tw :tokens "text-lg font-semibold text-stone-700 mt-8 mb-3") "S-expression")
    (error-boundary
      (~examples/source
        :src-code (highlight sx-code (if sx-lang sx-lang "lisp"))))
    (when
      comp-placeholder-id
      (<>
        (h3
          (~tw :tokens "text-lg font-semibold text-stone-700 mt-8 mb-3")
          (if comp-heading comp-heading "Component"))
        (error-boundary (~docs/placeholder :id comp-placeholder-id))))
    (h3
      (~tw :tokens "text-lg font-semibold text-stone-700 mt-8 mb-3")
      (if handler-heading handler-heading "Server handler"))
    (error-boundary
      (~examples/source
        :src-code (highlight
          (join "\n\n" (map handler-source handler-names))
          (if handler-lang handler-lang "sx"))))
    (div
      (~tw :tokens "flex items-center justify-between mt-6")
      (h3 (~tw :tokens "text-lg font-semibold text-stone-700") "Wire response")
      (~docs/clear-cache-btn))
    (when wire-note (p (~tw :tokens "text-stone-500 text-sm mb-2") wire-note))
    (when
      wire-placeholder-id
      (error-boundary (~docs/placeholder :id wire-placeholder-id)))))
