Repository navigation
3 split pane canvas view.excalidraw
excalidraw-plugin: parsed tags: [excalidraw, abstract-view, architecture, layout, design-guidelines] excalidraw-default-mode: view excalidraw-export-dark: true
The Split-Pane Guide & Canvas View (MarkdownCanvasPage.tsx hosted inside CanvasPage.tsx) is the interactive teaching, documentation, and showcase engine of WOD Wiki. It coordinates an asymmetric layout that couples rich explanatory narrative prose with an interactive code execution sandbox.
Key architectural responsibilities include:
- Dual-Pane Choreography: Binding a scrolling prose narrative on one panel to a persistent, reactive CodeMirror sandbox on the companion panel.
-
Interactive Syntax Quests: Tracking real-time user progress through challenges (
useScrollQuests.ts,useChapterProgress.ts,ChallengeHeaderBadge) as the reader types and runs code. -
Dynamic Fenced Controls: Parsing custom markdown directives including
viewfences (declaring initial code and runner presets) and inlinebuttonaction triggers. - Responsive Geometry Transformation: Elegantly morphing from a desktop side-by-side split screen into a mobile vertically-pinned sticky cockpit without duplicating state.
On desktop displays (≥1024px), the view splits the screen into complementary halves:
-
Global Icon Rail (L1, 56px) & Context Sidebar (L2, 240px):
- Provides chapter-by-chapter table of contents, collection groupings, and fast navigation.
-
Sticky Page Header (
StickyPageHeader.tsx):- Page Title & Subtitle: Guide name and chapter progression counter.
-
Quest Badge:
ChallengeHeaderBadgeindicating active quest completion percentage; clicking smooth-scrolls directly to the current quest block. - Header Controls: Cast button and Page Options ⋮ menu.
-
Left Column — Scrolling Prose Runway (
CanvasProse.tsx):- Standard readable-width typography.
- Explanatory copy, syntax anatomy callouts, and inline action buttons (
buttonfences) that load specific snippets into the companion editor panel.
-
Right Column — Sticky Editor Sandbox (
CanvasEditorPanel variant="desktop"):- Pinned full-height alongside the scrolling prose (
hidden lg:flex). - Hosts the live
EditorWindow.tsx/ CodeMirror workspace. -
Control Bar:
- Run Workout button (launches runtime or updates live visualizer).
- Reset button (reverts user edits back to the initial tutorial seed).
- Live validation status pill (syntax check indicator).
- Pinned full-height alongside the scrolling prose (
On mobile displays (<1024px), a side-by-side split would compromise text legibility and editor usability. The view automatically transforms into a stacked, sticky-pinned experience:
-
Top App Navbar:
- The desktop
StickyPageHeaderis hidden (max-lg:hidden). - The compact navbar houses the chapter title, hamburger menu, and
ChallengeHeaderBadge.
- The desktop
-
Sticky Pinned Editor Panel (
CanvasEditorPanel variant="mobile"):- Renders as a fixed sticky viewport pinned directly below the navbar (
top: 65px, minimum height 18rem). - Keeps the live code example and Run / Reset controls permanently accessible to the user while reading.
- Renders as a fixed sticky viewport pinned directly below the navbar (
-
Under-Scrolling Prose Runway:
- The narrative tutorial prose scrolls smoothly underneath the sticky editor panel.
- As the user scrolls through different sections, scroll-spy hooks (
usePageScrollSync) can dynamically swap the code snippet loaded in the pinned editor above.
-
Thumb Dock & Floating Controls:
- Search FAB and ⋮ overflow sheet float in the bottom corner with safe bottom padding (
max-lg:pb-48).
- Search FAB and ⋮ overflow sheet float in the bottom corner with safe bottom padding (
[Markdown Source with ```view & ```button fences]
│
▼
[parseCanvasMarkdown.ts]
├── Prose AST ───────────► CanvasProse (Scrolling narrative)
└── View Definition ─────► CanvasEditorPanel (Sandbox code)
│
▼
[Live CodeMirror 6 Window]
│
(User edits & runs code)
│
▼
[syntaxChallengeValidator] ──► useScrollQuests ──► ChallengeHeaderBadge
The table below specifies how each concrete route implements the abstract Split-Pane Guide & Canvas View:
| Typed View | Route Pattern | Content Focus | Left Panel / Under Runway | Right Panel / Sticky Window | Primary Action |
|---|---|---|---|---|---|
| Interactive Syntax Guide |
/guide/start, /guide/protocols
|
Syntax training & language dialect tutorial | Chapter explanations, grammar callouts, interactive quest challenges | Live CodeMirror runner, validation indicator, Run & Reset | Run Code (validates challenge & advances quest) |
| Analytics Tutorial |
/guide/wql, /ai-first
|
WQL query language & aggregation training | Analytical concept narrative, dataset schema docs | Live WQL query editor with instant chart preview frame | Execute Query (generates live timeseries/bar chart) |
| Collection Landing | /collections/:slug |
Curated workout set showcase & dispatch | Collection README markdown, category badges, author attribution | Interactive CollectionWorkoutsList + CodeMirror workout preview |
Schedule / Add to Today / Run selected workout |
| Scroll Quest Runway |
/p/:slug, ScrollCanvasPage
|
Step-by-step sequential tutorial runway | Staged tutorial cards (TourSectionRunway) |
Pinned typewriter runner with auto-advancing challenge steps | Next Challenge / Complete Quest |
SPLIT-PANE CANVAS VIEW: DUAL-PANE TO STICKY-PINNED ADAPTATION ^zjDq21q0
Desktop Layout (Viewport ≥ 1024px) — Side-by-Side Split ^l2XwtpIQ
StickyPageHeader: Guide › Syntax & Language ^d2hGDm7c
🏆 Quest 2/5 (40%) ^H8QUroXC
⎘ ^xrRIL8G6
⋮ ^Dnve4Hjx
SCROLLING PROSE RUNWAY (CanvasProse) ^zUKZVa8E
An AMRAP defines a timed interval where athletes complete as many rounds as possible. Notice how each movement specifies reps and load parameters. ^CEg8nyto
Load AMRAP Example ▶ ^tYwspg4I
✓ Define 20-minute cap • Add 5 Kettlebell Swings (24kg) • Add 10 Burpees ^wN8sK3uk
CanvasEditorPanel (variant='desktop') ^VG18NOO3
Run ▶ ^lQk7qRKf
Reset ^RUSGNnbS
20 min AMRAP 5 Pull-ups 10 Push-ups 15 Air Squats ^9Wxdjz3T
Live Execution Preview & Validation ^DqwCT1Rv
Status: VALID SYNTAX Estimated Pace: 18 rounds Target MET: 11.2 (Cardiovascular High) ^i4KV74cw
Mobile Layout (< 1024px) — Vertically Stacked & Pinned ^3LETPwIU
☰ ^YWh8Ozka
Guide › Syntax ^wTqJufLw
🏆 Q2 (40%) ^9au9Cj9J
Sticky Mini-Editor (top: 65px) ^LVCPqPlN
Run ▶ ^bZdkES7c
↺ ^ylYZg3lY
20 min AMRAP 5 Pull-ups 10 Push-ups 15 Air Squats ^Te2giQzw
Prose scrolls underneath the sticky editor: ^1YdWcT5J
An AMRAP defines a timed interval where athletes complete as many rounds as possible. Read here while code stays visible above! ^MEoA7yAf
⋮ ^lOJ2YpHm
🔍 ^Gg0lLthw
Right Side Panel transforms into Sticky Mobile Top Cockpit ^uwwyxQM2
%%
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
%%