Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -77,11 +77,13 @@ jobs:
--component-dir packages/core/components \
--raw

# A built-in component resolves from the module graph rather than a
# search path. Only the compiled binary proves it survives `deno compile`.
# The directory target runs every built-in's colocated document at once.
- name: Smoke test the built-in components with no search path
run: ./dist/xmd test packages/core/src/components --raw
# A built-in resolves from the module graph rather than a search path.
# Only the compiled binary proves it survives `deno compile`. The
# directory target discovers every colocated document beneath core's
# source at once — the built-in components under `components/`, and the
# structural directives, which resolve no file at all.
- name: Smoke test the built-ins with no search path
run: ./dist/xmd test packages/core/src --raw

# The guide documents this command and its output; running it keeps the
# value-root contract executable rather than described.
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -123,8 +123,26 @@ executable.md treats the root document like a component:
- JSX tags with capitalized names become component invocations.
- `<Content />` acts as a slot for child content.
- Text segments support `{meta.key}` and `{props.key}` interpolation.
- `<If condition={...}>`, with an optional `<Else>` block, is a structural directive rather than a component.
- Markdown is healed at execution boundaries with `remend` so formatting does not bleed across components or executable blocks.

## Control flow

`<If>` expands one branch and only one. `condition` must be a boolean — there is no truthy or falsy coercion — and the branch that is not selected never expands, so nothing in it imports a component, runs a block, or creates a binding.

```md
<If condition={hasFailures}>
## Test failures

<FailureReport />
<Else>
All checks passed.
</Else>
</If>
```

`<Else>` is optional and, when present, is the final substantive child of its `<If>`. See the [control-flow guide](https://executable.md/docs/control-flow) for nesting and binding examples.

## Executable code blocks

The first word in a fence info string is the language. The remaining words form a modifier chain. Standard renderers only read the first word, so the modifiers stay invisible everywhere else.
Expand Down
96 changes: 96 additions & 0 deletions packages/core/src/If.test.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
# If

`<If>` chooses one branch of a document and expands only that branch. It is a
directive the expansion engine handles itself, so there is no `If.md` to import
and nothing to install before using it.

A true condition renders the content it guards.

<Test name="A true condition renders its children">
<Capture as="rendered"><If condition={true}>selected</If></Capture>
<AssertEquals actual={rendered} expected={"selected"} />
</Test>

A false condition with nothing else to say renders nothing at all — not an
empty region, not a placeholder.

<Test name="A false condition without Else renders nothing">
<Capture as="empty"><If condition={false}>hidden</If></Capture>
<AssertEquals actual={empty} expected={""} />
</Test>

`<Else>` supplies the alternative. Whichever branch the condition selects, the
other one contributes nothing to the output.

<Test name="A false condition selects the Else branch">
<Capture as="otherwise"><If condition={false}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={otherwise} expected={"otherwise"} />
</Test>

<Test name="A true condition selects the leading branch">
<Capture as="then"><If condition={true}>then<Else>otherwise</Else></If></Capture>
<AssertEquals actual={then} expected={"then"} />
</Test>

The condition is an ordinary expression, so it reads whatever the document has
already bound. Here `<Parse>` turns a JSON answer into a value, and `<If>`
branches on one of its fields.

<Test name="The condition reads a binding the document already made">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="verdict">
{ "passed": true }
</Parse>
<Capture as="report"><If condition={verdict.passed}>approved<Else>needs revision</Else></If></Capture>
<AssertEquals actual={report} expected={"approved"} />
</Test>

<Test name="The condition may compute a boolean from that binding">
<Parse schema={{ type: "object", properties: { passed: { type: "boolean" } }, required: ["passed"] }} as="failing">
{ "passed": false }
</Parse>
<Capture as="failingReport"><If condition={!failing.passed}>needs revision<Else>approved</Else></If></Capture>
<AssertEquals actual={failingReport} expected={"needs revision"} />
</Test>

The selected branch is spliced in where the directive was written, so content
around it keeps its order.

<Test name="Content around the selected branch keeps its order">
<Capture as="ordered">before|<If condition={true}>mid<Else>alt</Else></If>|after</Capture>
<AssertEquals actual={ordered} expected={"before|mid|after"} />
</Test>

`<If>` opens no scope of its own. A binding the selected branch creates behaves
like one written inline, so it is still readable after `</If>`.

<Test name="A capture from the selected branch survives the block">
<If condition={true}><Capture as="picked">chosen</Capture></If>
<AssertEquals actual={picked} expected={"chosen"} />
</Test>

The branch that is not selected never expands, so it binds nothing. A reference
to a name it would have created stays unresolved, exactly as a reference to a
name no one ever wrote.

<Test name="The unselected branch creates no binding">
<If condition={false}><Capture as="skipped">never</Capture><Else>alternative</Else></If>
<Capture as="probe">[{skipped}]</Capture>
<AssertEquals actual={probe} expected={"[{skipped}]"} />
</Test>

Conditionals nest, and each one selects on its own.

<Test name="Nested conditionals select independently">
<Capture as="nested"><If condition={true}>outer:<If condition={false}>inner<Else>alt</Else></If>:end<Else>skipped</Else></If></Capture>
<AssertEquals actual={nested} expected={"outer:alt:end"} />
</Test>

"Never expands" is stronger than "renders nothing". An assertion placed in the
unselected branch would fail this document if it ran — the test passes only
because that branch is never reached.

<Test name="The unselected branch never runs">
<If condition={true}>selected<Else>
<AssertEquals actual={"the unselected branch ran"} expected={"it must never run"} />
</Else></If>
</Test>
Loading
Loading