From eb12a75f0a8a4654082121ccf7ce8af4415287ae Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Fri, 27 Mar 2026 12:02:04 +0800 Subject: [PATCH 01/25] feat: add CliCommand block with syntax highlighting and multi-example docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New markdown-it plugin (cli-command.ts) renders tags as styled code blocks with shiki-compatible --shiki-light/--shiki-dark color variables for longbridge binary (purple), subcommands (blue), args and inline comments (gray) - Header replaced with h2-style title matching SDK Links section; Install CLI link floats right with no border, pointing to /docs/cli - Expanded all non-trade CliCommand blocks from single-line to multi-line format with 2–4 real examples per command and locale-aware comments (en / zh-CN / zh-HK) across quote pull, content, subscribe, security, and watchlist docs (~160 files across 3 locales) Co-Authored-By: Claude Sonnet 4.6 --- docs/.vitepress/config/markdown.ts | 2 + docs/.vitepress/md-plugins/cli-command.ts | 130 ++++++++++++++++++ .../theme/components/CliCommand.vue | 70 ++++++++++ docs/.vitepress/theme/components/Skill.vue | 10 ++ docs/.vitepress/theme/components/index.ts | 1 + docs/.vitepress/theme/style/index.css | 28 ++++ docs/en/docs/content/create_topic.md | 5 + docs/en/docs/content/create_topic_reply.md | 2 + docs/en/docs/content/my_topics.md | 2 + docs/en/docs/content/security_news.md | 6 + docs/en/docs/content/security_topics.md | 6 + docs/en/docs/content/topic_detail.md | 2 + docs/en/docs/content/topic_replies.md | 5 + .../individual/watchlist_create_group.md | 5 + .../individual/watchlist_delete_group.md | 4 + .../docs/quote/individual/watchlist_groups.md | 4 + .../individual/watchlist_update_group.md | 6 + docs/en/docs/quote/pull/broker-ids.md | 4 + docs/en/docs/quote/pull/brokers.md | 5 + docs/en/docs/quote/pull/calc-index.md | 6 + docs/en/docs/quote/pull/candlestick.md | 6 + .../docs/quote/pull/capital-distribution.md | 6 + .../docs/quote/pull/capital-flow-intraday.md | 6 + docs/en/docs/quote/pull/depth.md | 6 + docs/en/docs/quote/pull/filings.md | 6 + .../en/docs/quote/pull/history-candlestick.md | 6 + .../en/docs/quote/pull/history-market-temp.md | 6 + docs/en/docs/quote/pull/intraday.md | 6 + docs/en/docs/quote/pull/issuer.md | 4 + docs/en/docs/quote/pull/market-temp.md | 6 + docs/en/docs/quote/pull/option-quote.md | 5 + .../quote/pull/optionchain-date-strike.md | 5 + docs/en/docs/quote/pull/optionchain_date.md | 5 + docs/en/docs/quote/pull/quote.md | 6 + docs/en/docs/quote/pull/static.md | 6 + docs/en/docs/quote/pull/trade-day.md | 6 + docs/en/docs/quote/pull/trade-session.md | 4 + docs/en/docs/quote/pull/trade.md | 6 + docs/en/docs/quote/pull/warrant-filter.md | 6 + docs/en/docs/quote/pull/warrant-quote.md | 5 + docs/en/docs/quote/security/security.md | 4 + docs/en/docs/quote/subscribe/subsciption.md | 4 + docs/en/docs/trade/asset/account.md | 2 + docs/en/docs/trade/asset/cashflow.md | 2 + docs/en/docs/trade/asset/fund.md | 2 + docs/en/docs/trade/asset/margin_ratio.md | 2 + docs/en/docs/trade/asset/stock.md | 2 + .../trade/execution/history_executions.md | 2 + .../docs/trade/execution/today_executions.md | 2 + .../order/estimate_available_buy_limit.md | 2 + docs/en/docs/trade/order/history_orders.md | 2 + docs/en/docs/trade/order/order_detail.md | 2 + docs/en/docs/trade/order/replace.md | 2 + docs/en/docs/trade/order/submit.md | 5 + docs/en/docs/trade/order/today_orders.md | 2 + docs/en/docs/trade/order/withdraw.md | 2 + docs/zh-CN/docs/content/create_topic.md | 5 + docs/zh-CN/docs/content/create_topic_reply.md | 2 + docs/zh-CN/docs/content/my_topics.md | 2 + docs/zh-CN/docs/content/security_news.md | 6 + docs/zh-CN/docs/content/security_topics.md | 6 + docs/zh-CN/docs/content/topic_detail.md | 2 + docs/zh-CN/docs/content/topic_replies.md | 5 + docs/zh-CN/docs/getting-started.md | 41 ++++++ .../individual/watchlist_create_group.md | 5 + .../individual/watchlist_delete_group.md | 4 + .../docs/quote/individual/watchlist_groups.md | 4 + .../individual/watchlist_update_group.md | 6 + docs/zh-CN/docs/quote/pull/broker-ids.md | 4 + docs/zh-CN/docs/quote/pull/brokers.md | 5 + docs/zh-CN/docs/quote/pull/calc-index.md | 6 + docs/zh-CN/docs/quote/pull/candlestick.md | 6 + .../docs/quote/pull/capital-distribution.md | 6 + .../docs/quote/pull/capital-flow-intraday.md | 6 + docs/zh-CN/docs/quote/pull/depth.md | 6 + docs/zh-CN/docs/quote/pull/filings.md | 6 + .../docs/quote/pull/history-candlestick.md | 6 + .../docs/quote/pull/history-market-temp.md | 6 + docs/zh-CN/docs/quote/pull/intraday.md | 6 + docs/zh-CN/docs/quote/pull/issuer.md | 4 + docs/zh-CN/docs/quote/pull/market-temp.md | 6 + docs/zh-CN/docs/quote/pull/option-quote.md | 5 + .../quote/pull/optionchain-date-strike.md | 5 + .../zh-CN/docs/quote/pull/optionchain_date.md | 5 + docs/zh-CN/docs/quote/pull/quote.md | 6 + docs/zh-CN/docs/quote/pull/static.md | 6 + docs/zh-CN/docs/quote/pull/trade-day.md | 6 + docs/zh-CN/docs/quote/pull/trade-session.md | 4 + docs/zh-CN/docs/quote/pull/trade.md | 6 + docs/zh-CN/docs/quote/pull/warrant-filter.md | 6 + docs/zh-CN/docs/quote/pull/warrant-quote.md | 5 + docs/zh-CN/docs/quote/security/security.md | 4 + .../zh-CN/docs/quote/subscribe/subsciption.md | 4 + docs/zh-CN/docs/trade/asset/account.md | 2 + docs/zh-CN/docs/trade/asset/cashflow.md | 2 + docs/zh-CN/docs/trade/asset/fund.md | 2 + docs/zh-CN/docs/trade/asset/margin_ratio.md | 2 + docs/zh-CN/docs/trade/asset/stock.md | 2 + .../trade/execution/history_executions.md | 2 + .../docs/trade/execution/today_executions.md | 2 + .../order/estimate_available_buy_limit.md | 2 + docs/zh-CN/docs/trade/order/history_orders.md | 2 + docs/zh-CN/docs/trade/order/order_detail.md | 2 + docs/zh-CN/docs/trade/order/replace.md | 2 + docs/zh-CN/docs/trade/order/submit.md | 5 + docs/zh-CN/docs/trade/order/today_orders.md | 2 + docs/zh-CN/docs/trade/order/withdraw.md | 2 + docs/zh-HK/docs/content/create_topic.md | 5 + docs/zh-HK/docs/content/create_topic_reply.md | 2 + docs/zh-HK/docs/content/my_topics.md | 2 + docs/zh-HK/docs/content/security_news.md | 6 + docs/zh-HK/docs/content/security_topics.md | 6 + docs/zh-HK/docs/content/topic_detail.md | 2 + docs/zh-HK/docs/content/topic_replies.md | 5 + .../individual/watchlist_create_group.md | 5 + .../individual/watchlist_delete_group.md | 4 + .../docs/quote/individual/watchlist_groups.md | 4 + .../individual/watchlist_update_group.md | 6 + docs/zh-HK/docs/quote/pull/broker-ids.md | 4 + docs/zh-HK/docs/quote/pull/brokers.md | 5 + docs/zh-HK/docs/quote/pull/calc-index.md | 6 + docs/zh-HK/docs/quote/pull/candlestick.md | 6 + .../docs/quote/pull/capital-distribution.md | 6 + .../docs/quote/pull/capital-flow-intraday.md | 6 + docs/zh-HK/docs/quote/pull/depth.md | 6 + docs/zh-HK/docs/quote/pull/filings.md | 6 + .../docs/quote/pull/history-candlestick.md | 6 + .../docs/quote/pull/history-market-temp.md | 6 + docs/zh-HK/docs/quote/pull/intraday.md | 6 + docs/zh-HK/docs/quote/pull/issuer.md | 4 + docs/zh-HK/docs/quote/pull/market-temp.md | 6 + docs/zh-HK/docs/quote/pull/option-quote.md | 5 + .../quote/pull/optionchain-date-strike.md | 5 + .../zh-HK/docs/quote/pull/optionchain_date.md | 5 + docs/zh-HK/docs/quote/pull/quote.md | 6 + docs/zh-HK/docs/quote/pull/static.md | 6 + docs/zh-HK/docs/quote/pull/trade-day.md | 6 + docs/zh-HK/docs/quote/pull/trade-session.md | 4 + docs/zh-HK/docs/quote/pull/trade.md | 6 + docs/zh-HK/docs/quote/pull/warrant-filter.md | 6 + docs/zh-HK/docs/quote/pull/warrant-quote.md | 5 + docs/zh-HK/docs/quote/security/security.md | 4 + .../zh-HK/docs/quote/subscribe/subsciption.md | 4 + docs/zh-HK/docs/trade/asset/account.md | 2 + docs/zh-HK/docs/trade/asset/cashflow.md | 2 + docs/zh-HK/docs/trade/asset/fund.md | 2 + docs/zh-HK/docs/trade/asset/margin_ratio.md | 2 + docs/zh-HK/docs/trade/asset/stock.md | 2 + .../trade/execution/history_executions.md | 2 + .../docs/trade/execution/today_executions.md | 2 + .../order/estimate_available_buy_limit.md | 2 + docs/zh-HK/docs/trade/order/history_orders.md | 2 + docs/zh-HK/docs/trade/order/order_detail.md | 2 + docs/zh-HK/docs/trade/order/replace.md | 2 + docs/zh-HK/docs/trade/order/submit.md | 5 + docs/zh-HK/docs/trade/order/today_orders.md | 2 + docs/zh-HK/docs/trade/order/withdraw.md | 2 + 157 files changed, 921 insertions(+) create mode 100644 docs/.vitepress/md-plugins/cli-command.ts create mode 100644 docs/.vitepress/theme/components/CliCommand.vue diff --git a/docs/.vitepress/config/markdown.ts b/docs/.vitepress/config/markdown.ts index fc45252b..bde7b442 100644 --- a/docs/.vitepress/config/markdown.ts +++ b/docs/.vitepress/config/markdown.ts @@ -3,6 +3,7 @@ import { groupIconMdPlugin } from 'vitepress-plugin-group-icons' import { tipContainerPlugin } from '../md-plugins/tip-container' import { GenTryItPlugin } from '../md-plugins/gen-try-it.ts' import { NormalizeMdPlugin } from '../md-plugins/normalize-md' +import { CliCommandPlugin } from '../md-plugins/cli-command' export const markdownConfig: MarkdownOptions = { image: { @@ -51,5 +52,6 @@ export const markdownConfig: MarkdownOptions = { md.use(groupIconMdPlugin) md.use(tipContainerPlugin) md.use(GenTryItPlugin) + md.use(CliCommandPlugin) }, } diff --git a/docs/.vitepress/md-plugins/cli-command.ts b/docs/.vitepress/md-plugins/cli-command.ts new file mode 100644 index 00000000..1e4d6090 --- /dev/null +++ b/docs/.vitepress/md-plugins/cli-command.ts @@ -0,0 +1,130 @@ +import type MarkdownIt from 'markdown-it' + +function escapeHtml(str: string): string { + return str + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') +} + + +function getInstallLabel(localeIndex: string): string { + switch (localeIndex) { + case 'zh-CN': return '安装 CLI' + case 'zh-HK': return '安裝 CLI' + default: return 'Install CLI' + } +} + +function getInstallUrl(localeIndex: string): string { + switch (localeIndex) { + case 'zh-CN': return '/zh-CN/docs/cli' + case 'zh-HK': return '/zh-HK/docs/cli' + default: return '/docs/cli' + } +} + +// Colors matching github-light / github-dark shiki themes (auto-switch via CSS vars) +const C = { + binary: 'style="--shiki-light:#6f42c1;--shiki-dark:#b392f0"', // purple + subcmd: 'style="--shiki-light:#005cc5;--shiki-dark:#79b8ff"', // blue + args: 'style="--shiki-light:#24292e;--shiki-dark:#e1e4e8"', // default text +} as const + +// Colors for inline comments (the # ... part at end of a command line) +const C_comment = 'style="--shiki-light:#6a737d;--shiki-dark:#6a737d"' // gray + +function renderLine(line: string): string { + const trimmed = line.trim() + if (!trimmed) return '' + + // Pure comment lines (start with #) + if (trimmed.startsWith('#')) { + return `${escapeHtml(trimmed)}` + } + + // Split command from inline comment (# ...) + const commentIdx = trimmed.indexOf(' #') + const command = commentIdx >= 0 ? trimmed.slice(0, commentIdx).trimEnd() : trimmed + const comment = commentIdx >= 0 ? trimmed.slice(commentIdx) : '' + + const parts = command.split(/\s+/) + if (parts[0] !== 'longbridge') { + return `${escapeHtml(command)}${comment ? `${escapeHtml(comment)}` : ''}` + } + + let html = `${escapeHtml(parts[0])}` + if (parts.length > 1) { + html += ` ${escapeHtml(parts[1])}` + if (parts.length > 2) { + html += ` ${escapeHtml(parts.slice(2).join(' '))}` + } + } + if (comment) { + html += `${escapeHtml(comment)}` + } + return html + '' +} + +function generateCliBlock(content: string, installLabel: string, installUrl: string): string { + const lines = content + .split('\n') + .map(renderLine) + .filter(Boolean) + .join('\n') + + return ( + `
` + + `

CLI${escapeHtml(installLabel)}

` + + `
` + + `bash` + + `
` +
+    `${lines}
` + + `
` + ) +} + +function replaceCliCommand(src: string, installLabel: string, installUrl: string): string { + return src.replace( + /([\s\S]*?)<\/CliCommand>/g, + (_, content: string) => generateCliBlock(content.trim(), installLabel, installUrl), + ) +} + +export function CliCommandPlugin(md: MarkdownIt) { + md.core.ruler.push('cli_command', (state) => { + const localeIndex: string = state.env?.localeIndex ?? 'root' + const installLabel = getInstallLabel(localeIndex) + const installUrl = getInstallUrl(localeIndex) + + let i = 0 + while (i < state.tokens.length) { + const token = state.tokens[i] + + // Case 1: already an html_block (e.g. multiline ) + if (token.type === 'html_block' && token.content.includes('')) { + token.content = replaceCliCommand(token.content, installLabel, installUrl) + i++ + continue + } + + // Case 2: single-line parsed as paragraph > inline + if ( + token.type === 'paragraph_open' && + state.tokens[i + 1]?.type === 'inline' && + state.tokens[i + 1].content.includes('') && + state.tokens[i + 2]?.type === 'paragraph_close' + ) { + const replaced = replaceCliCommand(state.tokens[i + 1].content, installLabel, installUrl) + const htmlToken = new state.Token('html_block', '', 0) + htmlToken.content = replaced + state.tokens.splice(i, 3, htmlToken) + i++ + continue + } + + i++ + } + }) +} diff --git a/docs/.vitepress/theme/components/CliCommand.vue b/docs/.vitepress/theme/components/CliCommand.vue new file mode 100644 index 00000000..07c6d2b6 --- /dev/null +++ b/docs/.vitepress/theme/components/CliCommand.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/docs/.vitepress/theme/components/Skill.vue b/docs/.vitepress/theme/components/Skill.vue index 84c68101..579e127a 100644 --- a/docs/.vitepress/theme/components/Skill.vue +++ b/docs/.vitepress/theme/components/Skill.vue @@ -1,6 +1,7 @@ - - - - -``` - -- [ ] **Step 2: Verify the import path is correct** - -From `docs/.vitepress/theme/components/`, four `../` hops reach the project root where `openapi.yaml` lives: -- `../` → `docs/.vitepress/theme/` -- `../../` → `docs/.vitepress/` -- `../../../` → `docs/` -- `../../../../` → project root ✓ - -No change needed. - -- [ ] **Step 3: Commit** - -```bash -git add docs/.vitepress/theme/components/ApiReference.vue -git commit -m "feat: add custom ApiReference Vue component" -``` - ---- - -## Task 4: Wire into LayoutInner.vue and remove ScalarApiReference.vue - -**Files:** `docs/.vitepress/theme/layouts/LayoutInner.vue`, `docs/.vitepress/theme/components/ScalarApiReference.vue` - -- [ ] **Step 1: Update the import in LayoutInner.vue** - -In `docs/.vitepress/theme/layouts/LayoutInner.vue`, find line 19: - -```ts -import ScalarApiReference from '../components/ScalarApiReference.vue' -``` - -Replace with: - -```ts -import ApiReference from '../components/ApiReference.vue' -``` - -- [ ] **Step 2: Update the template usage in LayoutInner.vue** - -Find line 94: - -```vue - -``` - -Replace with: - -```vue - -``` - -- [ ] **Step 3: Delete ScalarApiReference.vue** - -```bash -rm docs/.vitepress/theme/components/ScalarApiReference.vue -``` - -- [ ] **Step 4: Commit** - -```bash -git add docs/.vitepress/theme/layouts/LayoutInner.vue -git rm docs/.vitepress/theme/components/ScalarApiReference.vue -git commit -m "feat: wire ApiReference into layout, remove ScalarApiReference" -``` - ---- - -## Task 5: Verify in dev server - -- [ ] **Step 1: Start dev server** - -```bash -bun run dev -``` - -Wait for `➜ Local: http://localhost:5173/` (port may vary). - -- [ ] **Step 2: Open the API reference page** - -Open `http://localhost:5173/docs/api` in a browser. - -Expected: -- VitePress top nav visible with "API" entry highlighted -- Left sidebar shows endpoint groups (Watchlist Management, Market Data, etc.) -- First endpoint auto-selected: "Get Watchlist Group List" -- Top half shows method badge + path + description prose -- Bottom half shows `shell` cURL code block and `json` response code block -- Code blocks have no shadow, match doc style - -- [ ] **Step 3: Test sidebar resize** - -Drag the divider line left and right. -Expected: sidebar width changes smoothly between 160px and 400px. - -- [ ] **Step 4: Test sidebar collapse** - -Click the `‹` toggle button. -Expected: sidebar collapses to zero width. Click `›` to restore. -Refresh the page — sidebar should restore to last saved width (localStorage persistence). - -- [ ] **Step 5: Test dark mode** - -Toggle the VitePress dark mode switch. -Expected: entire page including sidebar and code blocks switches theme correctly. - -- [ ] **Step 6: Check zh-CN route** - -Open `http://localhost:5173/zh-CN/docs/api`. -Expected: same API reference renders (spec is English only). - -- [ ] **Step 7: Final commit if any fixups were needed** - -```bash -git add -A -git commit -m "fix: api reference integration fixups" -``` diff --git a/docs/superpowers/plans/2026-03-24-scalar-api-reference.md b/docs/superpowers/plans/2026-03-24-scalar-api-reference.md deleted file mode 100644 index e41ca9b9..00000000 --- a/docs/superpowers/plans/2026-03-24-scalar-api-reference.md +++ /dev/null @@ -1,429 +0,0 @@ -# Scalar API Reference Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Add an interactive OpenAPI reference page at `/docs/api` using Scalar, with OAuth 2.0 + PKCE Try It support. - -**Architecture:** A new `ScalarApiReference.vue` component wraps `@scalar/api-reference`. `LayoutInner.vue` gains a third layout branch (`frontmatter.layout === 'api-reference'`) alongside the existing `showTryIt` branch. Three minimal `api.md` entry files (one per locale) trigger this layout. - -**Tech Stack:** `@scalar/api-reference` (Vue 3 component), VitePress 2.0 alpha, Vite `?raw` import, OAuth 2.0 Authorization Code + PKCE. - -**Note:** This project has no test suite. Verification is done with `bun run dev` and browser inspection. - ---- - -## File Map - -| Action | File | -|--------|------| -| Modify | `openapi.yaml` | -| Create | `docs/.vitepress/theme/components/ScalarApiReference.vue` | -| Modify | `docs/.vitepress/theme/layouts/LayoutInner.vue` | -| Create | `docs/en/docs/api.md` | -| Create | `docs/zh-CN/docs/api.md` | -| Create | `docs/zh-HK/docs/api.md` | -| Modify | `docs/.vitepress/locales/en/nav.ts` | -| Modify | `docs/.vitepress/locales/zh-CN/nav.ts` | -| Modify | `docs/.vitepress/locales/zh-HK/nav.ts` | -| Modify | `package.json` (via bun add) | - ---- - -## Task 1: Install dependency - -**Files:** `package.json`, `bun.lock` - -- [ ] **Step 1: Install `@scalar/api-reference`** - -```bash -bun add @scalar/api-reference -``` - -Expected: package added to `dependencies` in `package.json`. - -- [ ] **Step 2: Commit** - -```bash -git add package.json bun.lock -git commit -m "chore: add @scalar/api-reference" -``` - ---- - -## Task 2: Add `securitySchemes` to `openapi.yaml` - -**Files:** `openapi.yaml` - -`openapi.yaml` already has a `components:` section at line 2784 with `schemas:` (including `Error` and `Order`). We need to: -1. Add `security:` at the top level (before `paths:` at line 24) -2. Add `securitySchemes:` as a sibling of `schemas:` inside the existing `components:` block - -Do NOT create a new `components:` block — that would duplicate the key and produce invalid YAML. - -- [ ] **Step 1: Add `security` field before `paths:` (line 24)** - -Insert these two lines immediately before the `paths:` line: - -```yaml -security: - - oauth2: - - openapi -``` - -- [ ] **Step 2: Add `securitySchemes` inside the existing `components:` block** - -The existing `components:` block starts at line 2784: -```yaml -components: - schemas: - Error: - ... -``` - -Insert `securitySchemes:` as a new sibling of `schemas:`, so the block becomes: - -```yaml -components: - securitySchemes: - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: https://openapi.longbridge.com/oauth2/authorize - tokenUrl: https://openapi.longbridge.com/oauth2/token - scopes: - openapi: Full OpenAPI access - schemas: - Error: - ... (existing content unchanged) -``` - -Use the Edit tool to insert just the `securitySchemes:` block between `components:` and ` schemas:`. - -- [ ] **Step 3: Verify YAML is parseable** - -```bash -npx --yes js-yaml openapi.yaml > /dev/null && echo "YAML OK" -``` - -Expected: prints `YAML OK` with no errors. - -- [ ] **Step 4: Commit** - -```bash -git add openapi.yaml -git commit -m "feat: add OAuth2 securitySchemes to openapi.yaml" -``` - ---- - -## Task 3: Create `ScalarApiReference.vue` - -**Files:** `docs/.vitepress/theme/components/ScalarApiReference.vue` - -- [ ] **Step 1: Create the component** - -```vue - - - - - -``` - -- [ ] **Step 2: Verify the import path resolves** - -From `docs/.vitepress/theme/components/`, four `../` hops reach the project root: -- `../` → `docs/.vitepress/theme/` -- `../../` → `docs/.vitepress/` -- `../../../` → `docs/` -- `../../../../` → project root (where `openapi.yaml` lives) - -This is correct. No changes needed. - -- [ ] **Step 3: Commit** - -```bash -git add docs/.vitepress/theme/components/ScalarApiReference.vue -git commit -m "feat: add ScalarApiReference Vue component" -``` - ---- - -## Task 4: Add `api-reference` layout branch to `LayoutInner.vue` - -**Files:** `docs/.vitepress/theme/layouts/LayoutInner.vue` - -The existing layout already has a `v-if="!showTryIt"` / `v-else` pattern for the main content area. The sidebar and local nav need to be hidden for the API reference layout, and Scalar rendered instead. - -- [ ] **Step 1: Add import for `ScalarApiReference` at the top of the `