<!DOCTYPE html>
<html lang="en" dir="auto" data-theme="{{ theme }}" data-theme-default="{{ theme }}" data-editor-theme="{{ editor_theme | default(value='follow') }}" data-print-collapsed-content="{{ print_collapsed_content | default(value=false) }}">
<head>
{% include "theme-boot.html" %}
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="file-path" content="{{ file_path }}">
<meta name="workspace-id" content="{{ workspace_id }}">
<meta name="can-manage" content="{{ can_manage | default(value=false) }}">
<meta name="shared-annotation" content="{{ shared_annotation }}">
<meta name="enable-viewed" content="{{ enable_viewed }}">
<meta name="enable-search" content="{{ enable_search }}">
<meta name="enable-edit" content="{{ enable_edit }}">
{% if save_token %}<meta name="save-token" content="{{ save_token }}">{% endif %}
<meta name="enable-live" content="{{ enable_live }}">
<meta name="enable-chat" content="{{ enable_chat }}">
<meta name="default-chat-mode" content="{{ default_chat_mode }}">
<title>{{ title }}</title>
<link rel="icon" type="image/svg+xml" href="/_/favicon.svg">
<link rel="alternate icon" href="/_/favicon.ico">
<link id="markon-github-markdown-light" rel="stylesheet" href="/_/css/github-markdown-light.css" media="not all">
<link id="markon-github-markdown-dark" rel="stylesheet" href="/_/css/github-markdown-dark.css" media="not all">
<script>window.MarkonTheme && window.MarkonTheme.applyStylesheetMedia();</script>
<link rel="stylesheet" href="/_/css/github-print.css" media="print">
<link rel="stylesheet" href="/_/css/tokens.css">
<link rel="stylesheet" href="/_/css/shortcuts.css">
<link rel="stylesheet" href="/_/css/editor.css">
<link rel="stylesheet" href="/_/css/collaboration.css">
<link rel="stylesheet" href="/_/css/chat.css">
<style>
/* ========================================
BASE LAYOUT
======================================== */
:root {
/* Wide-screen side-rail geometry — the single source of truth for
the layout. The content area is NOT fixed-width; it is derived as
viewport − left reserve − right reserve. note-manager.ts reads
--markon-note-width / --markon-rail-edge-gap to place the cards,
so the cards and the gutter reserved for them can never drift. */
--markon-toc-width: 280px; /* left rail (TOC) width */
--markon-note-width: 280px; /* right rail (note card) width */
--markon-rail-edge-gap: 40px; /* rail outer edge → viewport edge (clears the scrollbar) */
--markon-content-gap: 24px; /* gap between the content frame and either rail */
/* Distance from each viewport edge the content must not cross. The
selection frame (.heading-section) draws its border on the
content-box edge, so reserving the rail + one content-gap also
reserves room for that frame border — it lands exactly one gap
away from the rail instead of overlapping it. */
--markon-reserve-left: calc(var(--markon-toc-width) + var(--markon-content-gap));
--markon-reserve-right: calc(var(--markon-rail-edge-gap) + var(--markon-note-width) + var(--markon-content-gap));
}
body {
box-sizing: border-box;
min-width: 200px;
max-width: 980px;
margin: 0 auto;
padding: 45px;
}
@media (max-width: 768px) {
body {
padding: 45px 20px;
}
}
@media screen and (min-width: 1401px) {
body {
max-width: none;
/* The 45px horizontal padding is a narrow-screen affordance; in
wide mode it would silently add to the gutter and push the
content-box edge inward, breaking the derived alignment. Zero
it so the content-box edge coincides with the reserve. */
padding-left: 0;
padding-right: 0;
margin-left: var(--markon-reserve-left);
margin-right: var(--markon-reserve-right);
}
}
a:visited {
color: inherit;
}
/* Body theme colors — driven by tokens (light/dark switched in editor.css) */
body {
background-color: var(--markon-bg-default);
color: var(--markon-fg-default);
}
@media (min-width: 1401px) {
#main-content { background-color: var(--markon-bg-default); }
}
/* ========================================
NAVIGATION COMPONENTS
======================================== */
/* Back Link */
.back-link {
margin-bottom: 20px;
display: flex;
align-items: center;
justify-content: flex-start;
column-gap: 47px;
row-gap: 12px;
flex-wrap: wrap;
}
.back-link a {
color: var(--markon-fg-muted);
text-decoration: none;
}
.back-link a:hover {
text-decoration: none;
}
.workspace-back-link {
display: inline-flex;
align-items: center;
gap: 8px;
min-width: 0;
max-width: min(680px, 100%);
margin-left: 5px;
color: var(--markon-fg-muted) !important;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
font-size: 12px;
line-height: 1.35;
}
.workspace-back-meta {
display: inline-flex;
align-items: center;
gap: 8px;
min-width: 0;
max-width: 100%;
}
.workspace-back-name {
display: inline-flex;
align-items: center;
flex: 0 1 auto;
max-width: 180px;
padding: 2px 10px;
border-radius: 999px;
background: var(--markon-bg-muted);
color: var(--markon-fg-muted);
font-size: 11px;
line-height: 1.55;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.workspace-back-path {
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
color: var(--markon-fg-muted);
text-overflow: ellipsis;
white-space: nowrap;
}
.markdown-body .workspace-back-link,
.markdown-body .workspace-back-link:link,
.markdown-body .workspace-back-link:visited,
.markdown-body .workspace-back-link:hover,
.markdown-body .workspace-back-link:active,
.markdown-body .workspace-back-link:focus {
color: var(--markon-fg-muted) !important;
text-decoration: none !important;
}
.markdown-body .workspace-back-link:hover,
.markdown-body .workspace-back-link:focus-visible {
color: var(--markon-fg-default) !important;
}
.workspace-back-link:hover .workspace-back-path,
.workspace-back-link:focus-visible .workspace-back-path {
color: var(--markon-fg-default);
text-decoration: underline;
text-underline-offset: 2px;
}
.workspace-back-icon {
width: 24px;
height: 24px;
flex: 0 0 auto;
}
/* Footer */
.footer {
margin-top: 10px;
padding-top: 20px;
font-size: 0.9rem;
text-align: left;
margin-left: -1px;
color: var(--markon-fg-muted);
}
.footer a {
text-decoration: none;
color: var(--markon-fg-muted);
}
.footer a:visited {
color: var(--markon-fg-muted);
}
.footer a:hover {
text-decoration: underline;
}
.footer-separator {
color: var(--markon-fg-muted);
margin: 0 8px;
}
.footer-clear-link {
color: var(--markon-fg-muted);
text-decoration: none;
cursor: pointer;
transition: color 0.2s;
}
.footer-clear-link:visited {
color: var(--markon-fg-muted);
}
.footer-clear-link:hover {
color: var(--markon-danger);
text-decoration: underline;
}
/* ========================================
TABLE OF CONTENTS
======================================== */
/* TOC Base Styles — border-radius = sphere radius (20px) so the
narrow-screen icon morphs into a panel whose corner arc matches the
icon's circle. */
.toc {
/* border-box so the rendered footprint equals --markon-toc-width
(padding + border included), matching .note-card-margin. Without
this the TOC is 280 + 2×15 padding + 2×1 border = 312px wide and
punches ~8px into the content that --markon-reserve-left sized
against 280. */
box-sizing: border-box;
padding: 15px;
border-radius: 20px;
font-size: 0.85rem;
opacity: var(--markon-panel-opacity, 0.9);
-webkit-user-select: none;
user-select: none;
}
.toc-title {
position: relative;
z-index: 1;
font-weight: 600;
margin-bottom: 10px;
font-size: 0.9rem;
-webkit-user-select: none;
user-select: none;
}
.toc-list {
position: relative;
z-index: 1;
list-style: none;
padding: 0 0 40vh 0;
margin: 0;
}
.toc-item {
padding: 4px 0;
}
.toc-item a {
text-decoration: none;
display: block;
padding: 2px 0;
transition: none;
}
.toc-item a:hover {
text-decoration: underline;
}
/* Viewport highlight: rendered as an absolute overlay that slides smoothly */
.toc-viewport-highlight {
position: absolute;
/* Extend past the text on both sides (into the .toc 15px padding) so
long titles don't touch the band edge — gives it inner breathing
room without moving the text. */
left: -8px; right: -8px;
background-color: var(--markon-accent-muted);
border-radius: 6px;
transition: top 0.25s ease, height 0.25s ease;
pointer-events: none;
z-index: 0;
}
.toc-item {
position: relative;
z-index: 1;
}
/* User-selected section */
.toc-item a.active {
color: var(--markon-accent);
}
/* Indent based on heading level */
.toc-level-1 { padding-left: 0; }
.toc-level-2 { padding-left: 12px; }
.toc-level-3 { padding-left: 24px; }
.toc-level-4 { padding-left: 36px; }
.toc-level-5 { padding-left: 48px; }
.toc-level-6 { padding-left: 60px; }
/* TOC Responsive Layout */
@media (min-width: 1401px) {
.toc {
position: fixed;
left: 0;
top: 0;
width: var(--markon-toc-width);
max-height: 100vh;
overflow-y: auto;
border: 1px solid transparent; /* Always have border for consistent width */
}
}
@media (max-width: 1400px) {
.toc {
position: relative;
margin-bottom: 30px;
max-width: 100%;
}
}
/* Z-index stacking: article, #toc-container, and footer are siblings in
body, competing directly in the root stacking context. Footer must
match article — otherwise its default (auto) stacks below the TOC,
and when the TOC is tall its tail can overlap footer links and
swallow clicks. Cursor location wins between article/toc on hover. */
@media (min-width: 1401px) {
article.markdown-body,
footer.footer {
position: relative;
z-index: 2;
}
#toc-container {
position: relative;
z-index: 1;
}
#toc-container:hover {
z-index: 3;
}
}
/* TOC Theme Colors */
.toc-title {
color: var(--markon-fg-default);
}
.toc-item a {
color: var(--markon-fg-muted);
}
.toc-item a:hover {
color: var(--markon-accent);
}
/* TOC Icon & Floating Menu (Narrow Screens). Borders match the Live
sphere/panel surface treatment — no drop shadow, just a 1px hairline
that thickens slightly under the dark-theme palette. */
#toc-icon {
background-color: var(--markon-bg-elevated);
border-color: var(--markon-border-emphasis);
opacity: var(--markon-panel-opacity, 0.9);
}
/* TOC icon uses --markon-fg-subtle so it reads as a secondary chrome
glyph (not as bold as document body text). The token swaps modes
by itself (light = #656d76, dark = #adbac7). */
#toc-icon .toc-bar {
background-color: var(--markon-fg-subtle);
}
#toc-icon .toc-close {
color: var(--markon-fg-subtle);
}
/* Floating TOC menu on narrow screens — same surface + border as icon */
@media (max-width: 1400px) {
.toc {
position: relative;
}
}
/* TOC background on wide screens (matches body, ensures overlap is clean) */
@media (min-width: 1401px) {
.toc {
background-color: var(--markon-bg-default);
}
#toc-container.toc-nav-active .toc {
position: fixed;
}
}
/* ========================================
EDITOR UI COMPONENTS (Theme Overrides)
Note: Base styles are in editor.css
Selection popover is anti-theme (dark surface in BOTH light/dark);
it lives entirely in editor.css — do not override here.
======================================== */
.note-textarea {
background: var(--markon-bg-default);
border: 1px solid var(--markon-border-default);
color: var(--markon-fg-default);
}
.note-textarea:focus {
border-color: var(--markon-accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--markon-accent) 15%, transparent);
}
.note-input-actions button {
background: var(--markon-bg-elevated);
border: 1px solid var(--markon-border-default);
color: var(--markon-fg-default);
}
.note-input-actions button:hover {
background: var(--markon-border-default);
}
.note-save {
background: var(--markon-success-emphasis) !important;
border-color: var(--markon-success-emphasis) !important;
}
.note-save:hover {
background: var(--markon-success-emphasis-hover) !important;
}
/* Note cards are styled once, in editor.css (.note-card-margin). */
.note-content {
color: var(--markon-fg-default);
}
.confirm-message {
color: var(--markon-fg-default);
}
.confirm-actions button {
background: var(--markon-bg-elevated);
border: 1px solid var(--markon-border-default);
color: var(--markon-fg-default);
}
.confirm-actions button:hover {
background: var(--markon-border-default);
}
/* Note markers + colour-pick highlights live in editor.css, driven by
the --markon-hl-* tokens (single source, theme-agnostic). */
/* Link colors in markdown body */
.markdown-body a:link,
.markdown-body a:visited,
.markdown-body a:hover,
.markdown-body a:active,
.markdown-body a:focus {
color: var(--markon-accent) !important;
}
.markon-visual-zoom-shell,
.markon-diagram.markon-visual-zoom-host {
position: relative;
}
.markon-visual-zoom-shell {
display: inline-block;
max-width: 100%;
vertical-align: middle;
}
.markon-visual-zoom-shell > a {
display: block;
}
.markon-visual-zoom-shell > img,
.markon-visual-zoom-shell > svg,
.markon-visual-zoom-shell > a > img,
.markon-visual-zoom-shell > a > svg {
display: block;
width: 100%;
height: auto;
max-width: 100%;
}
.markon-visual-zoom-trigger {
position: absolute;
top: 0;
right: 0;
z-index: var(--markon-z-content-overlay);
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
padding: 0;
box-sizing: border-box;
border: 1px solid transparent;
border-radius: 0;
background: transparent;
color: var(--markon-fg-muted);
box-shadow: none;
cursor: default;
opacity: 0;
pointer-events: none;
transition:
color var(--markon-transition-fast),
opacity var(--markon-transition-fast);
}
.markon-visual-zoom-trigger svg {
width: 18px;
height: 18px;
fill: none;
stroke: currentColor;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2.2;
}
.markon-visual-zoom-host:hover > .markon-visual-zoom-trigger,
.markon-visual-zoom-host:focus-within > .markon-visual-zoom-trigger,
.markon-visual-zoom-trigger:hover,
.markon-visual-zoom-trigger:focus-visible {
opacity: 1;
pointer-events: auto;
}
.markon-visual-zoom-trigger:hover,
.markon-visual-zoom-trigger:focus-visible {
color: var(--markon-fg-default);
border-color: color-mix(in srgb, var(--markon-fg-muted) 55%, transparent);
outline: none;
}
body.markon-visual-zoom-open {
overflow: hidden;
}
.markon-visual-zoom-overlay {
position: fixed;
inset: 0;
z-index: var(--markon-z-chrome);
background: var(--markon-bg-default);
color: var(--markon-fg-default);
touch-action: none;
overscroll-behavior: contain;
}
.markon-visual-zoom-corner-button {
position: absolute;
top: 6px;
right: 6px;
z-index: var(--markon-z-chrome-toolbar);
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
padding: 0;
box-sizing: border-box;
border: 1px solid transparent;
border-radius: 0;
background: transparent;
color: var(--markon-fg-muted);
box-shadow: none;
cursor: default;
font: 700 18px/1 var(--markon-ui-font);
opacity: 0.72;
transition:
color var(--markon-transition-fast),
opacity var(--markon-transition-fast);
}
.markon-visual-zoom-corner-button svg {
width: 18px;
height: 18px;
fill: currentColor;
}
.markon-visual-zoom-corner-button:hover,
.markon-visual-zoom-corner-button:focus-visible {
color: var(--markon-fg-default);
opacity: 1;
border-color: color-mix(in srgb, var(--markon-fg-muted) 55%, transparent);
outline: none;
}
.markon-visual-zoom-controls {
position: absolute;
left: 50%;
bottom: 34px;
z-index: var(--markon-z-chrome-toolbar);
display: inline-flex;
align-items: center;
gap: 10px;
transform: translateX(-50%);
color: var(--markon-fg-default);
font: 14px/1.2 var(--markon-ui-font);
-webkit-user-select: none;
user-select: none;
}
.markon-visual-zoom-scale {
min-width: 44px;
color: var(--markon-fg-muted);
font-variant-numeric: tabular-nums;
text-align: right;
}
.markon-visual-zoom-slider {
width: min(28vw, 220px);
min-width: 120px;
height: 18px;
padding: 0;
appearance: none;
-webkit-appearance: none;
background: transparent;
accent-color: var(--markon-fg-muted);
cursor: default;
}
.markon-visual-zoom-slider::-webkit-slider-runnable-track {
height: 1px;
border: 0;
background: var(--markon-border-emphasis);
}
.markon-visual-zoom-slider::-webkit-slider-thumb {
width: 14px;
height: 14px;
margin-top: -6.5px;
border: 0;
border-radius: 50%;
background: var(--markon-fg-muted);
-webkit-appearance: none;
}
.markon-visual-zoom-slider::-moz-range-track {
height: 1px;
border: 0;
background: var(--markon-border-emphasis);
}
.markon-visual-zoom-slider::-moz-range-thumb {
width: 14px;
height: 14px;
border: 0;
border-radius: 50%;
background: var(--markon-fg-muted);
}
.markon-visual-zoom-icon-action {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
padding: 0;
border: 0;
border-radius: 0;
background: transparent;
color: var(--markon-fg-muted);
cursor: default;
opacity: 0.78;
}
.markon-visual-zoom-icon-action svg {
width: 18px;
height: 18px;
fill: none;
stroke: currentColor;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2;
}
.markon-visual-zoom-icon-action:hover,
.markon-visual-zoom-icon-action:focus-visible {
color: var(--markon-fg-default);
opacity: 1;
outline: none;
}
.markon-visual-zoom-stage {
position: absolute;
inset: 0;
overflow: hidden;
cursor: grab;
touch-action: none;
user-select: none;
overscroll-behavior: contain;
}
.markon-visual-zoom-stage:active {
cursor: grabbing;
}
.markon-visual-zoom-overlay.is-zoom-tool-active .markon-visual-zoom-stage,
.markon-visual-zoom-overlay.is-zoom-tool-active .markon-visual-zoom-stage:active {
cursor: zoom-in;
}
.markon-visual-zoom-overlay.is-zoom-tool-active.is-zoom-out-tool-active .markon-visual-zoom-stage,
.markon-visual-zoom-overlay.is-zoom-tool-active.is-zoom-out-tool-active .markon-visual-zoom-stage:active {
cursor: zoom-out;
}
.markon-visual-zoom-frame {
position: absolute;
left: 50%;
top: 50%;
transform-origin: center center;
will-change: transform;
}
.markon-visual-zoom-content {
transform-origin: center center;
will-change: transform;
}
.markon-visual-zoom-content img,
.markon-visual-zoom-content svg,
.markon-visual-zoom-content .markon-diagram-canvas {
display: block;
max-width: none;
max-height: none;
}
.markon-visual-zoom-content .markon-diagram-canvas {
background: var(--markon-bg-overlay);
border: 1px solid var(--markon-border-default);
border-radius: var(--markon-radius-lg);
padding: 16px;
}
.markon-visual-zoom-marquee {
position: absolute;
z-index: var(--markon-z-content-overlay);
box-sizing: border-box;
border: 1px solid var(--markon-accent);
background: color-mix(in srgb, var(--markon-accent) 14%, transparent);
pointer-events: none;
}
@media (max-width: 520px) {
.markon-visual-zoom-corner-button {
top: 6px;
right: 6px;
}
.markon-visual-zoom-controls {
width: calc(100vw - 32px);
justify-content: center;
gap: 8px;
}
.markon-visual-zoom-slider {
min-width: 0;
width: min(36vw, 180px);
}
}
/* Viewed toolbar */
.viewed-toolbar {
border-color: var(--markon-border-default);
color: var(--markon-fg-muted);
}
.viewed-toolbar a {
color: var(--markon-accent);
}
.viewed-toolbar a.is-disabled,
.viewed-toolbar a[aria-disabled="true"],
.viewed-toolbar a.is-disabled:hover,
.viewed-toolbar a[aria-disabled="true"]:hover {
color: var(--markon-fg-muted);
cursor: default;
text-decoration: none;
}
/* Remove H1 bottom margin when followed by viewed toolbar */
.markdown-body h1:has(+ .viewed-toolbar) {
margin-bottom: 0;
}
/* Editor modal chrome is owned by editor.css via the --mk-editor-*
preset layer (default "follow page"); no inline overrides here so
the data-editor-theme presets can take effect. */
/* ========================================
SEARCH HIGHLIGHTING
======================================== */
/* Hit colours come from --markon-search-hit* (dark variants in the
token block). The pulse keyframes stay literal so the animation
keeps its exact two-theme behaviour. */
.search-highlight {
background-color: var(--markon-search-hit);
padding: 2px 0;
border-radius: 2px;
transition: all 0.3s ease;
}
.search-highlight-active {
background-color: var(--markon-search-hit-active);
animation: highlight-pulse 0.6s ease-in-out 3;
box-shadow: 0 0 0 3px var(--markon-search-hit-ring);
}
@keyframes highlight-pulse {
0%, 100% {
background-color: var(--markon-search-hit-active);
}
50% {
background-color: color-mix(in srgb, var(--markon-search-hit-active) 75%, var(--markon-search-hit) 25%);
}
}
/* ========================================
PRINT STYLES
======================================== */
@media print {
.back-link {
display: none;
}
.toc {
display: none;
}
.search-highlight,
.search-highlight-active {
background-color: transparent !important;
box-shadow: none !important;
}
}
</style>
{% if styles_css %}<style>{{ styles_css | safe }}</style>{% endif %}
{% include "i18n-boot.html" %}
{% if shortcuts_json %}<script>window.__MARKON_SHORTCUTS__ = {{ shortcuts_json | safe }};</script>{% endif %}
</head>
<body>
{% if toc and toc | length > 0 %}
<div id="toc-container">
<div id="toc-icon" title="Table of contents">
<span class="toc-bar"></span>
<span class="toc-bar"></span>
<span class="toc-bar"></span>
<svg class="toc-close" viewBox="0 0 24 24" width="18" height="18" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M7 7 L17 17 M17 7 L7 17" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
</svg>
</div>
<nav class="toc">
<div class="toc-title" id="toc-title">Table of Contents</div>
<ul class="toc-list">
{% for item in toc %}
<li class="toc-item toc-level-{{ item.level }}">
<a href="#{{ item.id }}">{{ item.text }}</a>
</li>
{% endfor %}
</ul>
</nav>
</div>
{% endif %}
<article class="markdown-body" data-markon-interactive-body>
{% if show_back_link %}
<div class="back-link">
<a href="{{ back_link }}" class="workspace-back-link">
<svg class="workspace-back-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill-rule="evenodd" aria-hidden="true" focusable="false">
<path d="M28 13.172A2.996 2.996 0 0 1 30 16v10a3 3 0 0 1-3 3H5a2.996 2.996 0 0 1-2.121-.879A2.996 2.996 0 0 1 2 26V12a2.996 2.996 0 0 1 2-2.828V8c0-.796.316-1.559.879-2.121A2.996 2.996 0 0 1 7 5h1V4c0-.796.316-1.559.879-2.121A2.996 2.996 0 0 1 11 1h14c.796 0 1.559.316 2.121.879C27.684 2.441 28 3.204 28 4zM4 12v14a.997.997 0 0 0 1 1h22a1 1 0 0 0 1-1V16a.997.997 0 0 0-1-1h-9.74c-.734 0-1.444-.27-1.993-.758l-3.363-2.989A.998.998 0 0 0 11.24 11H5a.997.997 0 0 0-1 1zm22 1V4a.997.997 0 0 0-1-1H11a.997.997 0 0 0-1 1v1h11c.796 0 1.559.316 2.121.879C23.684 6.441 24 7.204 24 8v5zm-4 0V8a.997.997 0 0 0-1-1H7a.997.997 0 0 0-1 1v1h5.24c.734 0 1.444.27 1.993.758l3.363 2.989a.998.998 0 0 0 .664.253z" fill="currentColor"></path>
</svg>
<span class="workspace-back-meta">
<span class="workspace-back-name">{{ workspace_display_name }}</span>
<span class="workspace-back-path">{{ workspace_display_path }}</span>
</span>
</a>
<button type="button" class="workspace-spotlight-trigger" data-workspace-spotlight-trigger aria-label="Search workspace" title="Search workspace">
<svg class="workspace-spotlight-trigger-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6.35 6.35" aria-hidden="true" focusable="false">
<path d="M2.894.511a2.384 2.384 0 0 0-2.38 2.38 2.386 2.386 0 0 0 2.38 2.384c.56 0 1.076-.197 1.484-.523l.991.991a.265.265 0 0 0 .375-.374l-.991-.992a2.37 2.37 0 0 0 .523-1.485C5.276 1.58 4.206.51 2.894.51zm0 .53c1.026 0 1.852.825 1.852 1.85S3.92 4.746 2.894 4.746s-1.851-.827-1.851-1.853.825-1.852 1.851-1.852z" fill="currentColor"></path>
</svg>
<span id="workspace-spotlight-trigger-text" class="workspace-spotlight-trigger-label">Search</span>
<span class="workspace-spotlight-trigger-kbd" aria-hidden="true">/</span>
</button>
</div>
{% endif %}
<div id="notes-sidebar"></div>
<div id="main-content">{{ content | safe }}</div>
</article>
<footer class="container footer">
<a href="https://kookyleo.github.io/markon/" id="footer-text">Powered by markon</a>
<span class="footer-separator"> | </span>
<a href="#" class="footer-clear-link" id="clear-annot-text" onclick="clearPageAnnotations(event, window.ws, window.isSharedAnnotationMode); return false;">Clear Annotations in this page</a>
<span class="footer-separator"> | </span>
<a href="https://github.com/kookyleo/markon/issues/new?title=%5BFeedback%5D%20&body=One-line%20summary%3A%0A%0A%23%23%20Environment%0A-%20markon%20version%3A%0A-%20OS%3A%0A-%20Browser%3A%0A%0A%23%23%20Steps%20to%20reproduce%0A1.%0A%0A%23%23%20Expected%0A%0A%23%23%20Actual%0A" id="feedback-link-text" target="_blank" rel="noopener noreferrer">Feedback</a>
<span class="footer-separator"> | </span>
<a href="#" id="kbd-link-text" onclick="window.shortcutsManager.showHelp(); return false;">Features & Shortcuts (?)</a>
<span class="footer-separator"> | </span>
<a href="https://github.com/kookyleo/markon/releases" id="footer-version" target="_blank" rel="noopener noreferrer" title="markon version">v{{ version }}</a>
</footer>
{% if has_math %}
<link rel="stylesheet" href="/_/js/katex/katex.min.css">
<script src="/_/js/katex/katex.min.js"></script>
<script src="/_/js/math-render.js"></script>
{% endif %}
{% if enable_edit and markdown_content_json %}
<!-- Original Markdown content for editor (JSON-encoded, HTML-safe) -->
<script type="application/json" id="original-markdown-data">{{ markdown_content_json | safe }}</script>
{% endif %}
<script type="module" src="/_/js/main.js"></script>
<script src="/_/js/viewed.js"></script>
<!-- Document-view page chrome: TOC tracking + layout i18n (classic IIFE,
runs during parse, sets __markonTocSetSelected before main.js). -->
<script src="/_/js/layout-page.js"></script>
</body>
</html>