Patterns for Birkly template tags inside <birkly-region>, [data-birkly-region], and enhance-only custom elements.
In short: Put template syntax in the Light DOM. Use <birkly-region collection="…" entry="…"> for shared header/footer, or list + ordered="newest" / ordered="order" for lists. After render, enhance (classes, listeners) — never wipe innerHTML. Closed Shadow DOM is fetch + Birkly.render only.
Beginner
Shared header / footer
<birkly-region collection="site_elements" entry="header"></birkly-region>
<main>…</main>
<birkly-region collection="site_elements" entry="footer"></birkly-region>
<script src="/birkly-client.js"></script>
Or with custom markup:
<birkly-region collection="site_elements" entry="header">
<header class="site-header">{'content'}</header>
</birkly-region>
List region
<birkly-region collection="blog" list ordered="newest">
<article>
<h2><a href="post.html?collection=blog&slug={slug}">{title}</a></h2>
<p>{'excerpt'}</p>
</article>
</birkly-region>
Ordering words (same as loops): newest, oldest, last-updated, order. Do not write ordered="date:desc".
Explicit root
<main data-birkly-region>
{from 'blog' get entry 'welcome'}
<h1>{title}</h1>
<div>{'content'}</div>
{endget}
</main>
Enhance only (good)
<script src="/birkly-client.js"></script>
<script src="/birkly-components.js"></script>
<script>
document.addEventListener('birkly:templates-processed', function () {
BirklyComponents.setActiveNav(document);
});
</script>
Wipe after render (bad)
class MyHeader extends HTMLElement {
connectedCallback() {
// BAD — deletes CMS-rendered content
this.innerHTML = '<header></header>';
}
}Advanced Users
For developers & AI
Discovery
- Markup containing
{for/{from/{if/ placeholders data-birkly-region<birkly-region>
Outermost wins, unless an explicit child demotes the ancestor.
Defaults (site_elements)
| Entry | Default wrapper |
|---|---|
header | <header class="birkly-site-header">{'content'}</header> |
footer | <footer class="birkly-site-footer">… |
navigation | <nav class="birkly-site-nav">… |
API
await Birkly.processTemplates();
await Birkly.processTemplates({ root: el, silent: true, force: false });
Events: birkly:region-processed (bubbles), birkly:templates-processed (full-page only).
Anti-patterns
innerHTML = …on a host that holds templates- Template tags in React/Vue JSX — use SPA guide
- Templates inside closed Shadow DOM
- Phantom
{entry 'x'.'y'}…{endentry} ordered="date:desc"
Integration attributes: Web components (integration).