<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Parley Docs</title>
<meta
name="description"
content="Workflow-focused Parley documentation for terminal review, TUI controls, and MCP integration."
/>
<script>
(() => {
const saved = localStorage.getItem("parley-docs-theme");
document.documentElement.dataset.theme =
saved === "light" || saved === "dark" ? saved : "dark";
})();
</script>
<link rel="stylesheet" href="/vendor/system.css/system.css" />
<link rel="stylesheet" href="/app.css" />
<link
id="hljs-theme"
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/github-dark.min.css"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/highlight.min.js"></script>
</head>
<body>
<script>
window.__PARLEY_DOCS__ = [
{
"slug": "overview",
"title": "Parley Overview",
"summary": "Parley is a terminal-first review tool for local git diffs, optimized for iterative AI-assisted code review.",
"headings": [
{
"depth": 1,
"text": "Parley Overview",
"id": "parley-overview"
},
{
"depth": 2,
"text": "Core model",
"id": "core-model"
},
{
"depth": 2,
"text": "Thread model at a glance",
"id": "thread-model-at-a-glance"
},
{
"depth": 2,
"text": "Review model at a glance",
"id": "review-model-at-a-glance"
},
{
"depth": 2,
"text": "AI eligibility summary",
"id": "ai-eligibility-summary"
},
{
"depth": 2,
"text": "Typical session",
"id": "typical-session"
},
{
"depth": 2,
"text": "What `pending` means",
"id": "what-pending-means"
},
{
"depth": 2,
"text": "Completion behavior",
"id": "completion-behavior"
}
],
"html": "<h1 id=\"parley-overview\">Parley Overview</h1>\n<p>Parley is a terminal-first review tool for local git diffs, optimized for iterative AI-assisted code review.</p>\n<p>Review discussions are anchored to concrete diff lines, and both thread state and review state are explicit.</p>\n<h2 id=\"core-model\">Core model</h2>\n<ul>\n<li><strong>Threaded line review</strong>: each comment thread is anchored to file path + line reference.</li>\n<li><strong>Thread lifecycle</strong>: <code>open</code>, <code>pending</code>, <code>addressed</code>.</li>\n<li><strong>Review lifecycle</strong>: <code>open</code>, <code>under_review</code>, <code>done</code>.</li>\n<li><strong>Keyboard-first workflow</strong>: full navigation and review operations without leaving the terminal.</li>\n<li><strong>Optional AI automation</strong>: run AI thread replies/refactors while keeping state transitions human-controlled.</li>\n</ul>\n<h2 id=\"thread-model-at-a-glance\">Thread model at a glance</h2>\n<ul>\n<li>A thread starts as <code>open</code> when a comment is created.</li>\n<li>Replies do not carry their own status; they update the parent thread status.</li>\n<li>When the original thread author replies, the thread becomes <code>open</code>.</li>\n<li>When a different author replies (including AI in normal flows), the thread becomes <code>pending</code>.</li>\n<li><code>addressed</code> is explicit: the original thread author marks the thread resolved.</li>\n</ul>\n<h2 id=\"review-model-at-a-glance\">Review model at a glance</h2>\n<ul>\n<li><code>open</code>: at least one thread is <code>open</code>.</li>\n<li><code>under_review</code>: no <code>open</code> threads remain.</li>\n<li><code>done</code>: explicitly set complete state.</li>\n<li><code>done</code> is guarded: unresolved threads block normal transition to <code>done</code>.</li>\n<li>If unresolved threads appear after <code>done</code>, the review auto-reopens to <code>open</code>.</li>\n</ul>\n<h2 id=\"ai-eligibility-summary\">AI eligibility summary</h2>\n<ul>\n<li>AI runs are skipped when review state is <code>done</code>.</li>\n<li><code>reply</code> mode targets <code>open</code> + <code>pending</code> threads by default.</li>\n<li><code>refactor</code> mode targets <code>open</code> threads only.</li>\n<li>Explicitly selected thread IDs can override reply-mode filtering (details in <code>docs/review-workflow.md</code>).</li>\n</ul>\n<h2 id=\"typical-session\">Typical session</h2>\n<pre><code class=\"language-bash\">parley review create my-review\nparley review start my-review\nparley tui --review my-review\n</code></pre>\n<p>If you are running over SSH and your terminal client does not play well with mouse reporting, start the TUI with <code>--no-mouse</code>.</p>\n<h2 id=\"what-pending-means\">What <code>pending</code> means</h2>\n<ul>\n<li><code>pending</code> indicates the thread is waiting on counterpart follow-up after a reply.</li>\n<li>A thread returns to <code>open</code> when the original author replies again or explicitly marks it open.</li>\n</ul>\n<h2 id=\"completion-behavior\">Completion behavior</h2>\n<ul>\n<li><code>done</code> is blocked while unresolved threads remain.</li>\n<li>Use force done (<code>Shift+D</code> in TUI) only when intentionally closing with unresolved threads.</li>\n</ul>\n"
},
{
"slug": "quickstart",
"title": "Quickstart",
"summary": "Covers Build, Create and start a review, and Open the TUI.",
"headings": [
{
"depth": 1,
"text": "Quickstart",
"id": "quickstart"
},
{
"depth": 2,
"text": "Build",
"id": "build"
},
{
"depth": 2,
"text": "Create and start a review",
"id": "create-and-start-a-review"
},
{
"depth": 2,
"text": "Open the TUI",
"id": "open-the-tui"
},
{
"depth": 2,
"text": "Core controls",
"id": "core-controls"
},
{
"depth": 3,
"text": "Navigation",
"id": "navigation"
},
{
"depth": 3,
"text": "Search and jump",
"id": "search-and-jump"
},
{
"depth": 3,
"text": "Threads",
"id": "threads"
},
{
"depth": 3,
"text": "Review state",
"id": "review-state"
},
{
"depth": 3,
"text": "AI and tools",
"id": "ai-and-tools"
},
{
"depth": 3,
"text": "Which status to set before AI",
"id": "which-status-to-set-before-ai"
},
{
"depth": 2,
"text": "Refresh after edits",
"id": "refresh-after-edits"
}
],
"html": "<h1 id=\"quickstart\">Quickstart</h1>\n<h2 id=\"build\">Build</h2>\n<pre><code class=\"language-bash\">cargo build --release\n</code></pre>\n<h2 id=\"create-and-start-a-review\">Create and start a review</h2>\n<pre><code class=\"language-bash\">./target/release/parley review create my-review\n./target/release/parley review start my-review\n</code></pre>\n<h2 id=\"open-the-tui\">Open the TUI</h2>\n<pre><code class=\"language-bash\">./target/release/parley tui --review my-review\n</code></pre>\n<p>If your terminal or SSH session mishandles mouse reporting, disable mouse capture:</p>\n<pre><code class=\"language-bash\">./target/release/parley tui --review my-review --no-mouse\n</code></pre>\n<h2 id=\"core-controls\">Core controls</h2>\n<h3 id=\"navigation\">Navigation</h3>\n<ul>\n<li><code>h/l</code>: previous or next file</li>\n<li><code>j/k</code>: move line cursor down or up</li>\n<li><code>PgUp/PgDn</code>: page scroll</li>\n<li><code>Ctrl+u/Ctrl+d</code>: half-page scroll</li>\n<li><code>g/G</code>: jump to first or last line</li>\n<li><code>zz</code>: center active line</li>\n</ul>\n<h3 id=\"search-and-jump\">Search and jump</h3>\n<ul>\n<li><code>:<line></code>: go to line</li>\n<li><code>/query</code>: set diff search query</li>\n<li><code>n/p</code>: next or previous search hit</li>\n</ul>\n<h3 id=\"threads\">Threads</h3>\n<ul>\n<li><code>m</code> or <code>c</code>: create thread on selected line</li>\n<li><code>r</code>: reply to selected thread</li>\n<li><code>N/P</code>: jump next or previous thread</li>\n<li><code>[/]</code>: select previous or next thread in current file</li>\n<li><code>e</code>: toggle selected thread expansion</li>\n<li><code>Shift+E</code>: cycle thread density (<code>compact</code>/<code>expanded</code>)</li>\n<li><code>a/o/f</code>: addressed/open/force-address selected thread</li>\n</ul>\n<h3 id=\"review-state\">Review state</h3>\n<ul>\n<li><code>s</code>: set review <code>open</code></li>\n<li><code>w</code>: set review <code>under_review</code></li>\n<li><code>d</code>: set review <code>done</code> (blocked if unresolved threads exist)</li>\n<li><code>Shift+D</code>: force set review <code>done</code></li>\n</ul>\n<h3 id=\"ai-and-tools\">AI and tools</h3>\n<ul>\n<li><code>x</code>: AI refactor selected thread</li>\n<li><code>X</code>: AI reply selected thread</li>\n<li><code>A</code>: AI refactor full review</li>\n<li><code>K</code>: cancel current AI run</li>\n<li><code>H</code>: toggle AI stream popup</li>\n<li><code>L</code>: open log file in <code>less</code></li>\n<li><code>Ctrl+k</code>: open command palette</li>\n<li><code>Ctrl+f</code>: focus files filter input</li>\n<li><code>?</code>: open in-app docs/help overlay</li>\n</ul>\n<h3 id=\"which-status-to-set-before-ai\">Which status to set before AI</h3>\n<ul>\n<li>For <code>refactor</code> (<code>x</code> or <code>A</code>): thread must be <code>open</code>.</li>\n<li>For <code>reply</code> (<code>X</code>): thread should be <code>open</code> or <code>pending</code>.</li>\n<li>If review is <code>done</code>, AI runs are skipped.</li>\n<li>Use explicit thread selection from MCP if you need reply mode on an <code>addressed</code> thread.</li>\n</ul>\n<h2 id=\"refresh-after-edits\">Refresh after edits</h2>\n<p>Inside TUI:</p>\n<pre><code class=\"language-text\">R\n</code></pre>\n<p>This reloads review metadata and current git diff.</p>\n"
},
{
"slug": "keybindings",
"title": "Keybindings",
"summary": "Covers Navigation, Search and jump, and Threads.",
"headings": [
{
"depth": 1,
"text": "Keybindings",
"id": "keybindings"
},
{
"depth": 2,
"text": "Navigation",
"id": "navigation"
},
{
"depth": 2,
"text": "Search and jump",
"id": "search-and-jump"
},
{
"depth": 2,
"text": "Threads",
"id": "threads"
},
{
"depth": 2,
"text": "Review state",
"id": "review-state"
},
{
"depth": 2,
"text": "AI",
"id": "ai"
},
{
"depth": 2,
"text": "Layout and tools",
"id": "layout-and-tools"
},
{
"depth": 2,
"text": "Help pane",
"id": "help-pane"
}
],
"html": "<h1 id=\"keybindings\">Keybindings</h1>\n<h2 id=\"navigation\">Navigation</h2>\n<ul>\n<li><code>h/l</code>: previous/next file</li>\n<li><code>j/k</code>: down/up line</li>\n<li><code>PgUp/PgDn</code>: page scroll</li>\n<li><code>Ctrl+u/Ctrl+d</code>: half-page scroll</li>\n<li><code>g/G</code>: top/bottom</li>\n<li><code>zz</code>: center active line</li>\n</ul>\n<h2 id=\"search-and-jump\">Search and jump</h2>\n<ul>\n<li><code>:<line></code>: go to line</li>\n<li><code>/query</code>: set search query</li>\n<li><code>n/p</code>: next/previous search match</li>\n</ul>\n<h2 id=\"threads\">Threads</h2>\n<ul>\n<li><code>m</code> or <code>c</code>: create thread on selected line</li>\n<li><code>r</code>: reply to selected thread</li>\n<li><code>N/P</code>: next/previous thread</li>\n<li><code>[/]</code>: previous/next selected thread in file</li>\n<li><code>e</code>: toggle selected thread expansion</li>\n<li><code>Shift+E</code>: cycle thread density</li>\n<li><code>a</code>: mark addressed</li>\n<li><code>o</code>: mark open</li>\n<li><code>f</code>: force-address selected thread</li>\n</ul>\n<h2 id=\"review-state\">Review state</h2>\n<ul>\n<li><code>s</code>: set review state <code>open</code></li>\n<li><code>w</code>: set review state <code>under_review</code></li>\n<li><code>d</code>: set review state <code>done</code> (guarded)</li>\n<li><code>Shift+D</code>: force set <code>done</code></li>\n</ul>\n<h2 id=\"ai\">AI</h2>\n<ul>\n<li><code>x</code>: AI refactor selected thread</li>\n<li><code>X</code>: AI reply selected thread</li>\n<li><code>A</code>: AI refactor review</li>\n<li><code>K</code>: cancel active AI run</li>\n<li><code>H</code>: toggle AI stream popup</li>\n<li><code>L</code>: open logs in <code>less</code></li>\n</ul>\n<h2 id=\"layout-and-tools\">Layout and tools</h2>\n<ul>\n<li><code>?</code>: open help docs</li>\n<li><code>Ctrl+k</code>: command palette</li>\n<li><code>Ctrl+f</code>: file filter input</li>\n<li><code>V</code>: toggle split diff</li>\n<li><code>S</code>: toggle side-by-side diff</li>\n<li><code>Tab</code>: switch active diff pane</li>\n<li><code></></code>: resize files pane</li>\n<li><code>b</code>: toggle thread navigator</li>\n</ul>\n<h2 id=\"help-pane\">Help pane</h2>\n<ul>\n<li><code>Tab</code> / <code>Shift+Tab</code> or <code>h/l</code>: switch help doc tab</li>\n<li><code>1-9</code>: direct tab select</li>\n<li><code>j/k</code>, <code>PgUp/PgDn</code>, <code>g/G</code>: scroll help content</li>\n<li><code></></code>: zoom help pane</li>\n<li><code>Esc</code> or <code>?</code>: close help pane</li>\n</ul>\n"
},
{
"slug": "review-workflow",
"title": "Review Workflow",
"summary": "Covers Thread model, Thread status transitions, and Review state reconciliation.",
"headings": [
{
"depth": 1,
"text": "Review Workflow",
"id": "review-workflow"
},
{
"depth": 2,
"text": "1. Thread model (authoritative)",
"id": "1-thread-model-authoritative"
},
{
"depth": 2,
"text": "2. Thread status transitions",
"id": "2-thread-status-transitions"
},
{
"depth": 3,
"text": "Automatic transitions",
"id": "automatic-transitions"
},
{
"depth": 3,
"text": "Manual transitions",
"id": "manual-transitions"
},
{
"depth": 2,
"text": "3. Review state reconciliation",
"id": "3-review-state-reconciliation"
},
{
"depth": 2,
"text": "4. Threading practice",
"id": "4-threading-practice"
},
{
"depth": 2,
"text": "5. Drive thread state deliberately",
"id": "5-drive-thread-state-deliberately"
},
{
"depth": 2,
"text": "6. AI eligibility matrix (what status to use before sending to AI)",
"id": "6-ai-eligibility-matrix-what-status-to-use-before-sending-to-ai"
},
{
"depth": 3,
"text": "Mode = `refactor`",
"id": "mode-refactor"
},
{
"depth": 3,
"text": "Mode = `reply`",
"id": "mode-reply"
},
{
"depth": 2,
"text": "7. Post-AI behavior",
"id": "7-post-ai-behavior"
},
{
"depth": 2,
"text": "8. Refresh after code edits",
"id": "8-refresh-after-code-edits"
}
],
"html": "<h1 id=\"review-workflow\">Review Workflow</h1>\n<h2 id=\"1-thread-model-authoritative\">1. Thread model (authoritative)</h2>\n<p>Each thread is a single <code>LineComment</code> with:</p>\n<ul>\n<li>anchor (<code>file_path</code>, <code>old_line</code>, <code>new_line</code>, <code>side</code>)</li>\n<li>thread <code>status</code> (<code>open</code>, <code>pending</code>, <code>addressed</code>)</li>\n<li>thread <code>author</code> (original commenter)</li>\n<li>ordered replies</li>\n</ul>\n<p>Replies do not have thread status. A reply event updates the parent thread status.</p>\n<h2 id=\"2-thread-status-transitions\">2. Thread status transitions</h2>\n<h3 id=\"automatic-transitions\">Automatic transitions</h3>\n<ul>\n<li>New comment created -> <code>open</code></li>\n<li>Reply by original thread author -> <code>open</code></li>\n<li>Reply by different author (including AI in normal flows) -> <code>pending</code></li>\n</ul>\n<h3 id=\"manual-transitions\">Manual transitions</h3>\n<ul>\n<li>Mark open: original thread author -> <code>open</code></li>\n<li>Mark addressed: original thread author -> <code>addressed</code></li>\n<li>Force mark addressed: force path (no author gate) -> <code>addressed</code></li>\n</ul>\n<h2 id=\"3-review-state-reconciliation\">3. Review state reconciliation</h2>\n<p>Review state is reconciled from thread statuses:</p>\n<ul>\n<li>if any thread is <code>open</code>, review is <code>open</code></li>\n<li>else if no thread is <code>open</code>, review is <code>under_review</code></li>\n<li><code>done</code> is explicit and guarded</li>\n</ul>\n<p><code>done</code> guard:</p>\n<ul>\n<li>normal set to <code>done</code> fails when unresolved threads (<code>open</code> or <code>pending</code>) exist</li>\n<li>force done bypasses this check</li>\n<li>if new unresolved activity appears after <code>done</code>, review auto-reopens to <code>open</code></li>\n</ul>\n<h2 id=\"4-threading-practice\">4. Threading practice</h2>\n<p>Use line-level comments for actionable feedback. Keep one issue per thread so resolution is obvious.</p>\n<h2 id=\"5-drive-thread-state-deliberately\">5. Drive thread state deliberately</h2>\n<ul>\n<li>Use <code>open</code> when code changes are required.</li>\n<li>Use <code>pending</code> when a reply is waiting on counterpart action.</li>\n<li>Use <code>addressed</code> when the original reviewer confirms resolution.</li>\n</ul>\n<h2 id=\"6-ai-eligibility-matrix-what-status-to-use-before-sending-to-ai\">6. AI eligibility matrix (what status to use before sending to AI)</h2>\n<p>Global precondition:</p>\n<ul>\n<li>review must not be <code>done</code> (AI session is skipped otherwise)</li>\n</ul>\n<h3 id=\"mode-refactor\">Mode = <code>refactor</code></h3>\n<ul>\n<li>No explicit <code>comment_ids</code> (auto-target):\n<ul>\n<li>processed: <code>open</code></li>\n<li>skipped: <code>pending</code>, <code>addressed</code></li>\n</ul>\n</li>\n<li>Explicit <code>comment_ids</code>:\n<ul>\n<li>processed: <code>open</code></li>\n<li>skipped: <code>pending</code>, <code>addressed</code></li>\n</ul>\n</li>\n</ul>\n<p>What this means:</p>\n<ul>\n<li>set thread to <code>open</code> before running AI refactor</li>\n<li><code>pending</code> or <code>addressed</code> threads will not be processed in refactor mode</li>\n</ul>\n<h3 id=\"mode-reply\">Mode = <code>reply</code></h3>\n<ul>\n<li>No explicit <code>comment_ids</code> (auto-target):\n<ul>\n<li>processed: <code>open</code>, <code>pending</code></li>\n<li>skipped: <code>addressed</code></li>\n</ul>\n</li>\n<li>Explicit <code>comment_ids</code>:\n<ul>\n<li>processed: any selected status (including <code>addressed</code>)</li>\n<li>skipped by status filter: none</li>\n</ul>\n</li>\n</ul>\n<p>What this means:</p>\n<ul>\n<li>for normal reply runs, use <code>open</code> or <code>pending</code></li>\n<li>explicit thread targeting can still send an <code>addressed</code> thread to AI reply mode</li>\n</ul>\n<h2 id=\"7-post-ai-behavior\">7. Post-AI behavior</h2>\n<ul>\n<li>AI output is persisted as a reply in the target thread.</li>\n<li>In typical human-authored threads, this sets thread status to <code>pending</code>.</li>\n<li>Review state then reconciles based on resulting thread statuses.</li>\n</ul>\n<h2 id=\"8-refresh-after-code-edits\">8. Refresh after code edits</h2>\n<p>After code edits or automation runs, refresh in TUI so thread anchors and diff context stay current.</p>\n"
},
{
"slug": "mcp",
"title": "MCP Integration",
"summary": "Parley exposes an MCP-compatible JSON-RPC interface over stdio.",
"headings": [
{
"depth": 1,
"text": "MCP Integration",
"id": "mcp-integration"
},
{
"depth": 2,
"text": "Transport",
"id": "transport"
},
{
"depth": 2,
"text": "Typical tools",
"id": "typical-tools"
},
{
"depth": 2,
"text": "`run_ai_session` behavior",
"id": "runaisession-behavior"
},
{
"depth": 2,
"text": "Example calls",
"id": "example-calls"
},
{
"depth": 2,
"text": "Notes",
"id": "notes"
}
],
"html": "<h1 id=\"mcp-integration\">MCP Integration</h1>\n<p>Parley exposes an MCP-compatible JSON-RPC interface over stdio.</p>\n<h2 id=\"transport\">Transport</h2>\n<ul>\n<li>Uses <code>Content-Length</code> framed JSON-RPC messages.</li>\n<li>Implements <code>initialize</code>, <code>tools/list</code>, and <code>tools/call</code>.</li>\n</ul>\n<h2 id=\"typical-tools\">Typical tools</h2>\n<ul>\n<li><code>list_reviews</code></li>\n<li><code>get_review</code></li>\n<li><code>list_open_comments</code></li>\n<li><code>add_reply</code></li>\n<li><code>mark_comment_addressed</code></li>\n<li><code>mark_comment_open</code></li>\n<li><code>set_review_state</code></li>\n<li><code>run_ai_session</code></li>\n</ul>\n<h2 id=\"runaisession-behavior\"><code>run_ai_session</code> behavior</h2>\n<p>Inputs:</p>\n<ul>\n<li><code>provider</code>: <code>codex</code> | <code>claude</code> | <code>opencode</code></li>\n<li><code>mode</code>: <code>reply</code> | <code>refactor</code> (optional; defaults by API call site)</li>\n<li><code>comment_ids</code>: optional explicit thread IDs</li>\n</ul>\n<p>Global gate:</p>\n<ul>\n<li>if review state is <code>done</code>, the AI session is skipped</li>\n</ul>\n<p>Target filtering:</p>\n<ul>\n<li><code>mode=refactor</code>:\n<ul>\n<li>auto-target (<code>comment_ids</code> omitted): only <code>open</code> threads</li>\n<li>explicit <code>comment_ids</code>: still only <code>open</code> threads are processed</li>\n</ul>\n</li>\n<li><code>mode=reply</code>:\n<ul>\n<li>auto-target (<code>comment_ids</code> omitted): <code>open</code> and <code>pending</code></li>\n<li>explicit <code>comment_ids</code>: status filter is bypassed for selection, so <code>addressed</code> can be processed</li>\n</ul>\n</li>\n</ul>\n<p>After processing:</p>\n<ul>\n<li>AI response is added as a thread reply</li>\n<li>thread status typically becomes <code>pending</code> (different-author reply path)</li>\n</ul>\n<h2 id=\"example-calls\">Example calls</h2>\n<p>Reply mode over all eligible threads:</p>\n<pre><code class=\"language-json\">{\n "name": "run_ai_session",\n "arguments": {\n "review_name": "my-review",\n "provider": "codex",\n "mode": "reply"\n }\n}\n</code></pre>\n<p>Refactor mode over open threads only:</p>\n<pre><code class=\"language-json\">{\n "name": "run_ai_session",\n "arguments": {\n "review_name": "my-review",\n "provider": "codex",\n "mode": "refactor"\n }\n}\n</code></pre>\n<p>Reply mode on explicit thread IDs:</p>\n<pre><code class=\"language-json\">{\n "name": "run_ai_session",\n "arguments": {\n "review_name": "my-review",\n "provider": "codex",\n "mode": "reply",\n "comment_ids": [12, 18]\n }\n}\n</code></pre>\n<h2 id=\"notes\">Notes</h2>\n<ul>\n<li>Review names can be resolved from current branch context.</li>\n<li>Thread state updates are explicit tool calls.</li>\n<li><code>set_review_state</code> accepts Parley review states (<code>open</code>, <code>under_review</code>, <code>done</code>).</li>\n<li><code>run_ai_session</code> supports <code>reply</code> and <code>refactor</code> modes.</li>\n</ul>\n"
}
];
</script>
<div class="site-shell">
<header class="topbar">
<a class="brandmark" href="/">
<span class="brandmark-badge">P</span>
<span class="brandmark-copy">
<span class="brandmark-label">System View</span>
<span class="brandmark-name">Parley Docs</span>
</span>
</a>
<div class="topbar-actions">
<a class="chip-link btn" href="/">Docs home</a>
<button class="theme-button btn" data-theme-toggle type="button">Use dark mode</button>
</div>
</header>
<div class="shell-grid">
<aside class="side-panel" id="side-panel" data-collapsed="false">
<div class="search-panel">
<label class="visually-hidden" for="search-input">Filter docs</label>
<input
class="search-input"
id="search-input"
type="search"
placeholder="Filter docs or sections"
/>
</div>
<button class="nav-toggle btn" id="nav-toggle" type="button">Hide contents</button>
<div class="nav-region">
<h2>Documents</h2>
<ul class="docs-nav" id="docs-nav"></ul>
</div>
</aside>
<main class="content-panel">
<p class="eyebrow" id="page-kicker">Document</p>
<h1 class="page-title" id="page-title">Loading…</h1>
<p class="page-intro" id="page-intro">
Parsing document metadata and content.
</p>
<div class="doc-meta-row" id="doc-meta-row"></div>
<article class="doc-article fade-in" id="doc-article"></article>
<div class="section" id="doc-nav-section">
<div class="section-header">
<div>
<p class="eyebrow">More docs</p>
<h2 class="section-title">Previous and next</h2>
</div>
</div>
<ul class="doc-nav-links" id="doc-nav-links"></ul>
</div>
</main>
<aside class="side-panel">
<h2>On this page</h2>
<p class="muted">Anchors from generated headings.</p>
<ul class="toc-list" id="toc-list"></ul>
</aside>
</div>
</div>
<script>
const themeObserver = new MutationObserver(() => {
const theme = document.documentElement.dataset.theme;
document.getElementById("hljs-theme").href =
theme === "dark"
? "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/github-dark.min.css"
: "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/github.min.css";
});
themeObserver.observe(document.documentElement, {
attributes: true,
attributeFilter: ["data-theme"],
});
</script>
<script src="/site.js"></script>
<script src="/docs-app.js"></script>
</body>
</html>