Single source of truth for Birkly CMS documentation

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.

<code>&lt;birkly-region&gt;</code> header and list patterns

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

  1. Markup containing {for / {from / {if / placeholders
  2. data-birkly-region
  3. <birkly-region>

Outermost wins, unless an explicit child demotes the ancestor.

Defaults (site_elements)

EntryDefault 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

  1. innerHTML = … on a host that holds templates
  2. Template tags in React/Vue JSX — use SPA guide
  3. Templates inside closed Shadow DOM
  4. Phantom {entry 'x'.'y'}…{endentry}
  5. ordered="date:desc"

Integration attributes: Web components (integration).