Appearance
Template Tree Elements
The Argument
The argument x (or however you name it) is an object, containing methods for each valid HTML element. For example, .div() is for creating <div> elements, .p() is for creating <p> elements, and so on. Each of these methods accepts multiple arguments, used for creating text content or child elements.
Here is an example of a simple table with one row and two columns:
js
(x) => {
x.table(
x.tr(
x.td('Row 1, Column 1'),
x.td('Row 1, Column 2'),
)
)
}html
<table>
<tr>
<td>Row 1, Column 1</td>
<td>Row 1, Column 2</td>
</tr>
</table>Element Properties (The First Argument)
The first argument also accepts an object, containing global element properties (id, class...) and element-specific properties:
js
(x) => {
x.a(
{
class: 'anchors', // "class" is valid for all elements
href: 'https://github.com/' // "href" is specific for <a> elements only
},
'Go to GitHub'
)
}html
<a>Go to GitHub</a>If the properties object is not the first argument, it is not honored. The following is NOT valid:
js
(x) => {
x.a(
'Go to GitHub',
{ href: 'https://github.com/' } // Doesn't work if not the first argument!
)
}html
<a>Go to GitHub</a>By the way, you can pass the text content as a textContent property, or as a second argument:
js
(x) => {
x.a({ href: 'https://github.com/', textContent: 'Go to GitHub' })
x.a({ href: 'https://github.com/' }, 'Go to GitHub')
}html
<a href="https://github.com/">Go to GitHub</a>
<a href="https://github.com/">Go to GitHub</a>Text Content and Child Elements
Each argument can be any of the following.
Text
js
(x) => {
x.div('text')
}html
<div>text</div>Number
js
(x) => {
x.div(123456)
}html
<div>123456</div>Child Elements
js
(x) => {
x.ul(
x.li('List Item 1'),
x.li('List Item 2'),
x.li('List Item 3'),
)
}html
<ul>
<li>List Item 1</li>
<li>List Item 2</li>
<li>List Item 3</li>
</ul>Array of Child Elements
js
(x) => {
x.ul(
[
x.li('List Item 1'),
x.li('List Item 2'),
x.li('List Item 3'),
]
)
}html
<ul>
<li>List Item 1</li>
<li>List Item 2</li>
<li>List Item 3</li>
</ul>Mixed
js
(x) => {
x.p(
'The quick brown ',
x.strong('fox'),
[' jumped', 3, 'times'],
[' over the lazy '],
x.strong('dog')
)
}html
<p>The quick brown <strong>fox</strong> jumped 3 times over the lazy <strong>dog</strong></p>Format Array
Where the type of the accepted argument or property is string, you can use format array instead. The idea is similar to the Node's format() function. The first element in the array is the printf-like format string, and the format arguments.
js
(x) => {
x.p(
{
class: ['a', 'b', 'c']
},
['The quick %s jumped %d times over the %s', 'brown fox', 3, 'lazy dog']
)
}html
<p class="a b c">The quick brown fox jumped 3 times over the lazy dog</p>The Template Tree is Synchronous
In the following example the <h2> element will not be rendered, because .h2() is executed after the tree has already been rendered:
js
(x) => {
x.h1('h1 element')
setTimeout(() => x.h2('h2 element'), 0)
x.h3('h3 element')
}html
<h1>h1 element</h1>
<h3>h3 element</h3>