Literal enhances the <template>
element
with a reactive DOM renderer that evaluates literal expressions
and binds updates to a signal graph. It is a view layer designed
for HTML authors to enhance content.
Weighs under 15kB bundled and gzipped.
<template is="literal-html">
Literal's entry point is the literal-html
template. It
is replaced in the DOM with its own rendered content:
<template is="literal-html">
<p>${ 'Hello world' }</p>
</template>
${ 'Hello world' }
Data is sourced with the src
attribute, which imports
a JS module or fetches JSON. Inside a template this data is available
as the constant data
:
<template is="literal-html" src="./data.json">
<p>${ data.text }</p>
</template>
${ data.text }
Templates that share a src
share a data
object.
As renders are bound to data
mutations, changes made in one
template are rendered in the others:
<template is="literal-html" src="./data.json">
<input value="${ data.text }" oninput="${ data.text = e.target.value }">
</template>
For quick prototyping, you can, alternatively, declare data using
data-*
attributes:
<template is="literal-html" data-text="Hello world">
<p>${ data.text }</p>
</template>
${ data.text }
Besides a data
object, templates have various other
objects and functions in scope. The include(url, data)
function gives Literal its composition model, rendering another template from a given data object:
<template id="todo-li">
<li>${ data.text }</li>
</template>
<template is="literal-html">
<ul>${ include('#todo-li', { text: 'Brush your teeth' }) }</ul>
</template>
The include()
function is partially applicable, allowing
you to concisely map an array of objects to template includes:
<template is="literal-html" src="./data/todo.json">
<ul>${ data.tasks.map(include('#todo-li')) }</ul>
</template>
Due to these features, Literal is suitable for animating the DOM.
Literal is written in JavaScript and can run in the browser without any
build/compile step. Turn logs and inline messages on on by setting a
DEBUG
flag on window
:
<!-- Enable debug messages -->
<script>window.DEBUG = true;</script>
<!-- Import and register template is="literal-html" -->
<script type="module" src="https://cdn.jsdelivr.net/gh/stephband/literal@main/literal-html/element.js"></script>
The production bundle strips logs and inline messages:
<!-- Import and register template is="literal-html" -->
<script type="module" src="https://cdn.jsdelivr.net/gh/stephband/literal@main/build/literal-html/element.js"></script>
You are free to put any functions and objects you like into literal's
shared template scope. Simply assign them to the Literal.scope
object – which must be done before a template is compiled.