README.md

February 25, 2026 ยท View on GitHub

Respo: A virtual DOM library in Calcit-js

Inspired by React and Reagent. Previously Respo/respo.cljs.

Project Info

  • Version: 0.16.21
  • Init Function: respo.main/main!
  • Reload Function: respo.main/reload!
  • Core Namespaces: 33 namespaces providing virtual DOM, rendering, components, and utilities
  • Dependencies: memof, lilac, calcit-test modules

Usage

In package.cirru and run caps:

{}
  :dependencies $ {}
    |Respo/respo.calcit |main

Latest

DOM syntax

ns app.demo $ :require
  respo.core :refer $ div

defn comp-demo (dispatch!)
  div
    {}
      :class-name "|demo-container"
      :style $ {} (:color :red)
      :on-click $ fn (event d!)
        d! :clicked
    div $ {}

More examples adapted from compact.cirru:

ns app.demo $ :require
  respo.core :refer $ defcomp a <>

defcomp comp-link (href text)
  a
    {} $ :href href
    <> text
ns app.demo $ :require
  respo.core :refer $ list-> div

defn comp-list ()
  list-> ({})
    [] $ [] :a
      div $ {}

Text Node:

ns app.demo $ :require
  respo.core :refer $ <>

defn comp-text (content)
  <> content

  ; with styles
  <> content $ {}
    :color :red
    :font-size 14

Component definition:

ns app.demo $ :require
  respo.core :refer $ div <>

let
    comp-container $ fn (content)
      div
        {}
          :class-name |demo-container
          :style $ {} (:color :red)
        <> content

App initialization:

ns app.demo $ :require
  respo.core :refer $ render!

; initialize store and update store
let
    *store $ atom $ {} (:point 0) (:states {})
    updater $ fn (store op)
      tag-match op
        (:TODO a b) store
        _ store
    dispatch! $ fn (op)
      reset! *store $ updater @*store op
    mount-point nil
    comp-container $ fn (state) state
  dispatch! $ :: :TODO 1 2

  ; render to the DOM
  defn render-app! ()
    render! mount-point (comp-container @*store) dispatch!

Rerender on store changes:

let
    *store $ atom $ {} (:point 0)
    render-app! $ fn () nil
  add-watch *store :changes $ fn ()
    render-app!

Reset virtual DOM caching during hot code swapping, and rerender:

ns app.demo $ :require
  respo.core :refer $ clear-cache!

let
    *store $ atom $ {} (:point 0)
    render-app! $ fn () nil
  add-watch *store :changes $ fn ()
    render-app!
  remove-watch *store :changes
  add-watch *store :changes $ fn ()
    render-app!
  clear-cache!
  render-app!

Adding effects to component:

ns app.demo $ :require
  respo.core :refer $ div

let
    effect-a $ fn (text)
      fn (action parent-element at-place?)
        println action
        ; action could be :mount :update :amount
        when (= :mount action) nil
  defn comp-a (text)
    []
      effect-a text
      div {}

Define a hooks plugin based on Calcit Record, better use a pure function:

ns app.demo $ :require
  respo.core :refer $ div <>

let
    plugin-x $ fn (states options)
      %::
        %{} :PluginX
          :render $ fn (self) (nth self 1)
          :show $ fn (self d! ? text) nil
        , :plugin-name
        div {} (<> "|Demo")

License

MIT


Documentation Index (For LLM Tool Integration)

This index helps LLM tools automatically fetch and reference documentation using relative paths and the cr CLI.

Getting Started

Guides and Concepts (see docs/guide/)

TopicPathOverview
Why Respodocs/guide/why-respo.mdMotivation and design philosophy
Virtual DOMdocs/guide/virtual-dom.mdUnderstanding virtual DOM concepts
Base Componentsdocs/guide/base-components.mdCore component patterns
DOM Elementsdocs/guide/dom-elements.mdHTML element creation and usage
Component Statesdocs/guide/component-states.mdManaging component state
DOM Propertiesdocs/guide/dom-properties.mdDOM property binding
DOM Eventsdocs/guide/dom-events.mdEvent handling in Respo
Stylesdocs/guide/styles.mdCSS and styling approach
Render Listsdocs/guide/render-list.mdEfficient list rendering
Hot Swappingdocs/guide/hot-swapping.mdHot code reloading setup
Server Renderingdocs/guide/server-rendering.mdSSR capabilities
Pros and Consdocs/guide/pros-and-cons.mdFramework comparison

API Reference (see docs/apis/)

Core macros and functions for building applications:

APIPathPurpose
defcompdocs/apis/defcomp.mdDefine components with macro
defeffectdocs/apis/defeffect.mdDefine lifecycle effects
divdocs/apis/div.mdCreate div elements
create-elementdocs/apis/create-element.mdDynamically create elements
render!docs/apis/render!.mdSync virtual DOM to real DOM
render-appdocs/apis/render-app.mdApplication rendering
expand-tagdocs/apis/expand-tag.mdExpand tag shortcuts
comp-spacedocs/apis/comp-space.mdSpacing component
comp-inspectdocs/apis/comp-inspect.mdInspection/debugging component
clear-cache!docs/apis/clear-cache!.mdClear memoization cache
patch-instance!docs/apis/patch-instance.mdPatch DOM instances
activate-instancedocs/apis/activate-instance.mdActivate DOM instances
pick-statesdocs/apis/pick-states.mdExtract component states
purify-elementdocs/apis/purify-element.mdClean element markup
mute-elementdocs/apis/mute-element.mdSilence element output
make-htmldocs/apis/make-html.mdGenerate HTML
make-stringdocs/apis/make-string.mdSerialize to string
find-element-diffsdocs/apis/find-element-diffs.mdFind DOM differences
apply-dom-changesdocs/apis/apply-dom-changes.mdApply DOM patches
realize-ssr!docs/apis/realize-ssr_.mdServer-side rendering
list->docs/apis/list->.mdCreate list containers

Agent Workflows

Agent-oriented CLI workflows (query/check-md automation) are maintained in Agents.md.