Run design boards as plain HTML
dc-lite renders interactive design boards written with {{ holes }}, <sc-for>, <sc-if> and a DCLogic component class, the format Claude Design boards use. Your prototype runs on GitHub Pages, Netlify or any static host, with animations, timers and click logic intact. No editor, no login, no build step.
One board file in, one page out
# convert a board, images named by asset id go in ./assets
node tools/convert.mjs Board.dc.html --out dist --assets ./assets
cp src/dc-lite.js dist/
npx serve dist
class Component extends DCLogic { state = { count: 0 }; renderVals() { return { count: this.state.count, wave: () => this.setState(s => ({ count: s.count + 1 })) }; } }
Each render patches the live DOM with morphdom and skips any subtree whose markup did not change, so CSS keyframes never restart.
Counters written through ref at 60 fps survive a re-render, the same as in React.
One capturing listener per event type on the root, so handlers outlive patches and media events like onPlaying still fire.
setState with batching, componentDidMount, componentDidUpdate, componentWillUnmount, destroy().
What a board can use
{{ a.b }}Dotted lookups into renderVals() in text and attributes. False and null render empty.
<sc-for list as>Repeat children per item, with itemIndex available.
<sc-if value>Render children when the value is truthy.
onClick="{{ fn }}"Any onX handler, delegated from the root.
ref="{{ fn }}"Callback and object refs, plus a React.createRef shim.
data-propsDeclared defaults become this.props, overridable from DCLite.mount().
Not supported yet: nested components through <dc-import> or <x-import>. dc-lite is an independent project, not made or endorsed by Anthropic. Claude is a trademark of Anthropic.