Annotate

Annotated content with margin notes. Regular content flows normally while nested note tags appear as annotations alongside the text.

Margin notes

Notes float in the right margin next to the content they annotate.

{% annotate %}
The refrakt.md framework builds on Markdoc to provide a semantic content transformation pipeline. Authors write standard Markdown with lightweight tag annotations, and the framework handles the rest — parsing, transforming, and rendering into structured, themed HTML.

{% note %}
Markdoc is an open-source Markdown-based authoring system created by Stripe. It extends Markdown with a custom tag syntax that enables structured content without sacrificing readability.
{% /note %}

Runes are the core abstraction — they wrap ordinary Markdown and reinterpret it based on context. A heading inside a nav rune becomes a group title; a list inside a recipe rune becomes ingredients. The same primitives take on different meaning depending on which rune contains them.
{% /annotate %}
<div data-rune="annotate">
  <meta content="margin" data-field="variant">
  <div data-name="body">
    <p>The refrakt.md framework builds on Markdoc to provide a semantic content transformation pipeline. Authors write standard Markdown with lightweight tag annotations, and the framework handles the rest — parsing, transforming, and rendering into structured, themed HTML.</p>
    <aside data-field="note" data-rune="annotate-note">
      <div data-name="body">
        <p>Markdoc is an open-source Markdown-based authoring system created by Stripe. It extends Markdown with a custom tag syntax that enables structured content without sacrificing readability.</p>
      </div>
    </aside>
    <p>Runes are the core abstraction — they wrap ordinary Markdown and reinterpret it based on context. A heading inside a nav rune becomes a group title; a list inside a recipe rune becomes ingredients. The same primitives take on different meaning depending on which rune contains them.</p>
  </div>
</div>

The refrakt.md framework builds on Markdoc to provide a semantic content transformation pipeline. Authors write standard Markdown with lightweight tag annotations, and the framework handles the rest — parsing, transforming, and rendering into structured, themed HTML.

Runes are the core abstraction — they wrap ordinary Markdown and reinterpret it based on context. A heading inside a nav rune becomes a group title; a list inside a recipe rune becomes ingredients. The same primitives take on different meaning depending on which rune contains them.

<div class="rf-annotate rf-annotate--margin" data-variant="margin" data-rune="annotate" data-density="full">
  <div data-name="body" class="rf-annotate__body" data-section="body">
    <p>The refrakt.md framework builds on Markdoc to provide a semantic content transformation pipeline. Authors write standard Markdown with lightweight tag annotations, and the framework handles the rest — parsing, transforming, and rendering into structured, themed HTML.</p>
    <aside data-field="note" class="rf-annotate-note" data-rune="annotate-note" data-density="full">
      <div data-name="body" class="rf-annotate-note__body">
        <p>Markdoc is an open-source Markdown-based authoring system created by Stripe. It extends Markdown with a custom tag syntax that enables structured content without sacrificing readability.</p>
      </div>
    </aside>
    <p>Runes are the core abstraction — they wrap ordinary Markdown and reinterpret it based on context. A heading inside a nav rune becomes a group title; a list inside a recipe rune becomes ingredients. The same primitives take on different meaning depending on which rune contains them.</p>
  </div>
</div>

Inline notes

Use variant="inline" to show annotations as highlighted blocks within the flow.

{% annotate variant="inline" %}
Runes use standard Markdoc tag syntax.

{% note %}
This means any Markdoc-compatible editor will understand them.
{% /note %}

The content inside a rune is regular Markdown.
{% /annotate %}
<div data-rune="annotate">
  <meta content="inline" data-field="variant">
  <div data-name="body">
    <p>Runes use standard Markdoc tag syntax.</p>
    <aside data-field="note" data-rune="annotate-note">
      <div data-name="body">
        <p>This means any Markdoc-compatible editor will understand them.</p>
      </div>
    </aside>
    <p>The content inside a rune is regular Markdown.</p>
  </div>
</div>

Runes use standard Markdoc tag syntax.

The content inside a rune is regular Markdown.

<div class="rf-annotate rf-annotate--inline" data-variant="inline" data-rune="annotate" data-density="full">
  <div data-name="body" class="rf-annotate__body" data-section="body">
    <p>Runes use standard Markdoc tag syntax.</p>
    <aside data-field="note" class="rf-annotate-note" data-rune="annotate-note" data-density="full">
      <div data-name="body" class="rf-annotate-note__body">
        <p>This means any Markdoc-compatible editor will understand them.</p>
      </div>
    </aside>
    <p>The content inside a rune is regular Markdown.</p>
  </div>
</div>

Attributes

AttributeTypeDefaultDescription
variantstringmarginDisplay variant: margin, tooltip, inline

Common attributes

All block runes share these attributes for layout and theming.

AttributeTypeDefaultDescription
widthstringcontentPage grid width: content, wide, or full
spacingstringVertical spacing: flush, tight, default, loose, or breathe
insetstringHorizontal padding: flush, tight, default, loose, or breathe
tintstringNamed colour tint from theme configuration
tint-modestringautoColour scheme override: auto, dark, or light
bgstringNamed background preset from theme configuration