# Immediate-Mode DOM Tools Lightweight tooling around DOM creation. Designed to be embedded piecewise in self-contained Web Components. I love virtual DOM libraries like [superfine][], [preact][], and [inferno][]. But not all creations need the efficient updating logic. Creations like self-sufficient Web Components, *where every byte of superfluous logic is wasted*. The `imm-dom` library enables concise expression of DOM creation, while never setting `innerHTML` with uncontrolled content. Elements are created using `createElement()` or `createElementNS()`. Strings become `Text` nodes via `createTextNode()` or `elem.append()`. Attributes are set using `elem.setAttribute()`. DOM injection is protected against, in conjunction with caution and expertise, to provide tools for dynamic content. [superfine]: https://github.com/jorgebucaran/superfine#readme [preact]: https://preactjs.com/ [inferno]: https://infernojs.org/ [rollup]: https://rollupjs.org ## Demo See the [mini demo](https://shanewholloway.github.io/js-imm-dom/) and the [demo's index.html source](index.html). ## API `imm-dom` provdes layers of DOM tools: - Creating new DOM elements, both HTML and SVG - Manipulating (existing) DOM elements - Defining Web Components - Misc utilities: promises, deferreds, render animation frames, etc. Read more in [docs/README.md](./docs/README.md) ### [Immediate Custom Element Web Componet API](docs/imm_elem.md): ```html
some body text for the CDN demo
``` Inspired by: - [uce](https://github.com/WebReflection/uce#readme) ### [Immediate DOM API](docs/imm_dom.md): ```javascript imm_html.article({class: 'awesome'}, imm_html.h3('my demo title'), 'some body text') // or tag('article', {class: 'awesome'}, tag('h3', 'my demo title'), 'some body text') ``` Inspired by: - [hyperscript](https://github.com/hyperhype/hyperscript#readme) - [superfine][] - [crel](https://github.com/KoryNunn/crel#readme) - [jaml](https://github.com/edspencer/jaml#readme) - [jsonml](http://www.jsonml.org) - [hast](https://github.com/syntax-tree/hast#readme) ### [Immediate Template API](docs/imm_tmpl.md): ```javascript imm_tmpl`

${ 'my demo title' }

${ 'some body text' }
` ``` Inspired by: - [uce](https://github.com/WebReflection/uce#readme) and [uhtml](https://github.com/WebReflection/uhtml#readme) ### [Immediate requestAnimationFrame API](docs/imm_raf.md) - `imm_raf()` returns a promise for the next `requestAnimationFrame` tick. - `ImmRAF` is like `ImmElem` using `requestAnimationFrame` to decouple attribute updates from rendering. ## Size Cost in Bytes To be embedded in each web component custom element, the individual pieces must be small. Thus `imm-dom` is _designed to include only the parts actually used_ when paired with a tree-shaking tool like [rollup][]. One component might only use `imm_set()` from `imm_dom_core.js` for ~ **1350 bytes** minified; ~ **700 brotli**. An web component may take advantage of `ImmElem` from `imm_elem.js` for ~ **2700 bytes** minified; ~ **1200 brotli**. A heavy rendering component may take advantage of `ImmRAF` from `imm_elem_raf.js` for ~ **3200 bytes** minified; ~ **1500 brotli**. The entire library is ~ **9500 bytes** minified; ~ **4000 brotli** -- perfect for bundling a larger web component library and sharing structure. | module | brotli | minified | source | |:-----------------|---------:|---------:|---------:| | `index` | 3910 B | 9462 B | 21672 B | | `imm_dom` | 697 B | 1344 B | 3562 B | | `imm_elem` | 1203 B | 2684 B | 7317 B | | `imm_tmpl` | 951 B | 1918 B | 5623 B | See auto-generated [compressed size report](./docs/compressed.md). ## License [BSD 2-clause](LICENSE)