Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
a37ba5c
feat(site): add exclude option to genMarkdowDocs
huacnlee Apr 10, 2026
c95f565
feat(site): add CLI nav item and multi-sidebar for en locale
huacnlee Apr 10, 2026
b3a9668
chore: remove unused isCN variable from en nav
huacnlee Apr 10, 2026
2139782
feat(site): add CLI nav item and multi-sidebar for zh-CN locale
huacnlee Apr 10, 2026
c41cdf2
fix(site): scope zh-CN docs sidebar to /docs/ prefix
huacnlee Apr 10, 2026
9e10218
feat(site): add CLI nav item and multi-sidebar for zh-HK locale
huacnlee Apr 10, 2026
0d01ab9
feat(cli-docs): create CLI section directory structure
huacnlee Apr 10, 2026
6e4df19
feat(cli-docs): add CLI index, setup, tui, and release-notes pages
huacnlee Apr 10, 2026
56d11f8
feat(cli-docs): add market-data command pages (14 pages)
huacnlee Apr 10, 2026
3de3098
fix(cli-docs): use full 'longbridge <cmd>' H1 in market-data pages
huacnlee Apr 10, 2026
badba95
feat(cli-docs): add derivatives command pages (option, warrant)
huacnlee Apr 10, 2026
e4a2ef9
feat(cli-docs): add fundamentals command pages (7 pages)
huacnlee Apr 10, 2026
6cdd013
fix(cli-docs): add --kind CF example to financial-report page
huacnlee Apr 10, 2026
c39dc24
feat(cli-docs): add content, watchlist, and orders command pages (8 p…
huacnlee Apr 10, 2026
c038c14
feat(cli-docs): add account and research command pages (9 pages)
huacnlee Apr 10, 2026
882b3b5
fix(cli-docs): add /docs/quote/ link to option.md Requirements
huacnlee Apr 10, 2026
8689722
fix(cli-docs): fix spec issues in content, watchlist, and orders pages
huacnlee Apr 10, 2026
d11415e
fix(cli-docs): fix spec issues in account and research pages
huacnlee Apr 10, 2026
fc6a0eb
fix(cli-docs): fix spec issues in market-data pages
huacnlee Apr 10, 2026
bbb70ee
fix(cli-docs): fix quality issues in fundamentals pages (valuation, d…
huacnlee Apr 10, 2026
d8100e0
fix(cli-docs): normalize Requirements wording and fix minor quality i…
huacnlee Apr 10, 2026
725d058
fix(cli-docs): fix quality issues in fundamentals and orders pages
huacnlee Apr 10, 2026
9110737
fix(cli-docs): fix quality issues in derivatives pages (option, warrant)
huacnlee Apr 10, 2026
0f00871
fix(cli-docs): remove --format prose from brokers.md scenario
huacnlee Apr 10, 2026
e5ebaec
fix(cli-docs): fix quality issues in market-data pages
huacnlee Apr 10, 2026
7b2d2a0
fix(cli-docs): fix docs sidebar, rename setup to installation, add zh…
huacnlee Apr 10, 2026
7713916
docs(cli): add command output examples to all CLI pages
huacnlee Apr 10, 2026
f381159
docs(cli): translate Chinese metric names to English in fundamentals …
huacnlee Apr 10, 2026
abf015b
docs(cli): add topic detail example to topic page
huacnlee Apr 10, 2026
f3b3f05
docs(cli): rename 'Scenarios' to 'Examples' across all CLI pages
huacnlee Apr 10, 2026
10c5214
docs(cli): remove Chinese text from topic detail example
huacnlee Apr 10, 2026
68189d0
docs(cli): add external links for SEC EDGAR, Form 4, 13F, HKEX refere…
huacnlee Apr 10, 2026
1411ffb
docs(cli): reorder sidebar — analysis first, then trading/account, wa…
huacnlee Apr 10, 2026
24432f0
feat(cli-docs): add sidebar group icons, GitHub link on installation,…
huacnlee Apr 10, 2026
f159425
docs(cli): sync GitHub link to zh-CN and zh-HK installation pages
huacnlee Apr 10, 2026
dc24081
feat(cli-command): add Usage link pointing to specific CLI command page
huacnlee Apr 10, 2026
647fe87
feat: sidebar icons for docs groups + CliCommand redesign + en CliCom…
huacnlee Apr 10, 2026
9bd31bf
fix(cli): fix CliCommand header-codeblock disconnect and build error
huacnlee Apr 10, 2026
7b05d62
style(cli): remove box-shadow from CliCommand block
huacnlee Apr 10, 2026
e6031ab
fix(cli): fix CLI usage links 404 in zh-CN/zh-HK, update Trade icon
huacnlee Apr 10, 2026
fd8ce9a
feat(cli): add zh-CN/zh-HK translations for all CLI docs
huacnlee Apr 10, 2026
8f34e6b
docs(cli): add sample order data to order.md
huacnlee Apr 10, 2026
4a7ab88
docs(cli): move portfolio to first position under Account
huacnlee Apr 10, 2026
452d267
docs(cli): move positions to second under Account
huacnlee Apr 10, 2026
4644705
feat(cli): add GitHub link to CLI sidebar with icon
huacnlee Apr 10, 2026
e603f0b
fix(docs): fix missing /zh-CN/ prefix in CLI doc links
huacnlee Apr 10, 2026
0c7fa6a
feat(docs): improve doc footer links styling
huacnlee Apr 10, 2026
b29585b
.
huacnlee Apr 10, 2026
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,5 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json

old_docs
.superpowers
docs/superpowers
.claude/worktrees
1 change: 1 addition & 0 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ export default defineConfig(
pattern: ({ filePath }) => {
return `https://github.com/longbridge/developers/edit/main/docs/${filePath}`
},
text: 'Edit',
},
logo: {
src: 'https://assets.wbrks.com/assets/logo/logo-without-title-lb.svg',
Expand Down
8 changes: 3 additions & 5 deletions docs/.vitepress/locales/en/nav.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import type { DefaultTheme } from 'vitepress'
import { filterNavItems, getRegion } from '../../region-utils'
import { filterNavItems } from '../../region-utils'

export const nav = (): DefaultTheme.NavItem[] => {
const isCN = getRegion() === 'cn'
return filterNavItems([
{ text: 'Home', link: '/', activeMatch: '^(/en)?/$' },
{ text: 'Skill', link: '/skill', activeMatch: '^(/en)?/skill' },
isCN
? { text: 'CLI', link: '/docs/cli', activeMatch: '^(/en)?/docs/cli' }
: { text: 'Docs', link: '/docs', activeMatch: '^(/en)?/docs(?!/api)' },
{ text: 'Docs', link: '/docs', activeMatch: '^(/en)?/docs(?!/cli)(?!/api)' },
{ text: 'CLI', link: '/docs/cli', activeMatch: '^(/en)?/docs/cli' },
{ text: 'API Reference', link: '/docs/api', activeMatch: '^(/en)?/docs/api' },
{ text: 'SDK', link: '/sdk', activeMatch: '^(/en)?/sdk' },
{ text: 'Issues', link: 'https://github.com/longbridge/openapi/issues', target: '_blank' },
Expand Down
25 changes: 22 additions & 3 deletions docs/.vitepress/locales/en/sidebar.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
import { DefaultTheme } from 'vitepress'
import { genMarkdowDocs } from '../../theme/utils/gen'
import { genMarkdowDocs, SIDEBAR_ICONS_MAP } from '../../theme/utils/gen'

const docsSidebar = genMarkdowDocs('en', 'docs')
const docsSidebar = genMarkdowDocs('en', 'docs', { exclude: ['cli'] })
const cliSidebar = genMarkdowDocs('en', 'docs/cli')

export const sidebar: DefaultTheme.Sidebar = docsSidebar()
function buildCliSidebar(): DefaultTheme.SidebarItem[] {
const items = cliSidebar()
const installIdx = items.findIndex((item) => typeof item.link === 'string' && item.link.includes('installation'))
const githubItem: DefaultTheme.SidebarItem = {
text: `<span class="sidebar-item-icon">${SIDEBAR_ICONS_MAP.github}</span>GitHub`,
link: 'https://github.com/longbridge/longbridge-terminal',
}
if (installIdx !== -1) {
items.splice(installIdx + 1, 0, githubItem)
} else {
items.push(githubItem)
}
return items
}

export const sidebar: DefaultTheme.Sidebar = {
'/docs/cli': buildCliSidebar(),
'/docs': docsSidebar(),
}
8 changes: 3 additions & 5 deletions docs/.vitepress/locales/zh-CN/nav.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import type { DefaultTheme } from 'vitepress'
import { filterNavItems, getRegion } from '../../region-utils'
import { filterNavItems } from '../../region-utils'

export const nav = (lang: string): DefaultTheme.NavItem[] => {
const isCN = getRegion() === 'cn'
return filterNavItems([
{ text: '首页', link: `/${lang}/`, activeMatch: `^/${lang}/$` },
{ text: 'Skill', link: `/${lang}/skill`, activeMatch: `^/${lang}/skill` },
isCN
? { text: 'CLI', link: `/${lang}/docs/cli`, activeMatch: `^/${lang}/docs/cli` }
: { text: '文档', link: `/${lang}/docs`, activeMatch: `^/${lang}/docs(?!/api)` },
{ text: '文档', link: `/${lang}/docs`, activeMatch: `^/${lang}/docs(?!/cli)(?!/api)` },
{ text: 'CLI', link: `/${lang}/docs/cli`, activeMatch: `^/${lang}/docs/cli` },
{ text: 'API 参考', link: `/${lang}/docs/api`, activeMatch: `^/${lang}/docs/api` },
{ text: 'SDK', link: `/${lang}/sdk`, activeMatch: `^/${lang}/sdk` },
{ text: 'Issues', link: 'https://github.com/longbridge/openapi/issues', target: '_blank' },
Expand Down
23 changes: 20 additions & 3 deletions docs/.vitepress/locales/zh-CN/sidebar.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
import { DefaultTheme } from 'vitepress'
import { genMarkdowDocs } from '../../theme/utils/gen'
import { genMarkdowDocs, SIDEBAR_ICONS_MAP } from '../../theme/utils/gen'

const lang = 'zh-CN'
const docsSidebar = genMarkdowDocs(lang, 'docs')
const docsSidebar = genMarkdowDocs(lang, 'docs', { exclude: ['cli'] })
const cliSidebar = genMarkdowDocs(lang, 'docs/cli')

function buildCliSidebar(): DefaultTheme.SidebarItem[] {
const items = cliSidebar()
const installIdx = items.findIndex((item) => typeof item.link === 'string' && item.link.includes('installation'))
const githubItem: DefaultTheme.SidebarItem = {
text: `<span class="sidebar-item-icon">${SIDEBAR_ICONS_MAP.github}</span>GitHub`,
link: 'https://github.com/longbridge/longbridge-terminal',
}
if (installIdx !== -1) {
items.splice(installIdx + 1, 0, githubItem)
} else {
items.push(githubItem)
}
return items
}

export const sidebar: DefaultTheme.Sidebar = {
[`/${lang}`]: { base: `/${lang}`, items: docsSidebar() },
[`/${lang}/docs/cli`]: buildCliSidebar(),
[`/${lang}/docs`]: docsSidebar(),
}
8 changes: 3 additions & 5 deletions docs/.vitepress/locales/zh-HK/nav.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import type { DefaultTheme } from 'vitepress'
import { filterNavItems, getRegion } from '../../region-utils'
import { filterNavItems } from '../../region-utils'

export const nav = (lang: string): DefaultTheme.NavItem[] => {
const isCN = getRegion() === 'cn'
return filterNavItems([
{ text: '首頁', link: `/${lang}/`, activeMatch: `^/${lang}/$` },
{ text: 'Skill', link: `/${lang}/skill`, activeMatch: `^/${lang}/skill` },
isCN
? { text: 'CLI', link: `/${lang}/docs/cli`, activeMatch: `^/${lang}/docs/cli` }
: { text: '文檔', link: `/${lang}/docs`, activeMatch: `^/${lang}/docs(?!/api)` },
{ text: '文檔', link: `/${lang}/docs`, activeMatch: `^/${lang}/docs(?!/cli)(?!/api)` },
{ text: 'CLI', link: `/${lang}/docs/cli`, activeMatch: `^/${lang}/docs/cli` },
{ text: 'API 參考', link: `/${lang}/docs/api`, activeMatch: `^/${lang}/docs/api` },
{ text: 'SDK', link: `/${lang}/sdk`, activeMatch: `^/${lang}/sdk` },
{ text: 'Issues', link: 'https://github.com/longbridge/openapi/issues', target: '_blank' },
Expand Down
23 changes: 20 additions & 3 deletions docs/.vitepress/locales/zh-HK/sidebar.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
import { DefaultTheme } from 'vitepress'
import { genMarkdowDocs } from '../../theme/utils/gen'
import { genMarkdowDocs, SIDEBAR_ICONS_MAP } from '../../theme/utils/gen'

const lang = 'zh-HK'
const docsSidebar = genMarkdowDocs(lang, 'docs')
const docsSidebar = genMarkdowDocs(lang, 'docs', { exclude: ['cli'] })
const cliSidebar = genMarkdowDocs(lang, 'docs/cli')

function buildCliSidebar(): DefaultTheme.SidebarItem[] {
const items = cliSidebar()
const installIdx = items.findIndex((item) => typeof item.link === 'string' && item.link.includes('installation'))
const githubItem: DefaultTheme.SidebarItem = {
text: `<span class="sidebar-item-icon">${SIDEBAR_ICONS_MAP.github}</span>GitHub`,
link: 'https://github.com/longbridge/longbridge-terminal',
}
if (installIdx !== -1) {
items.splice(installIdx + 1, 0, githubItem)
} else {
items.push(githubItem)
}
return items
}

export const sidebar: DefaultTheme.Sidebar = {
[`/${lang}`]: { base: `/${lang}`, items: docsSidebar() },
[`/${lang}/docs/cli`]: buildCliSidebar(),
[`/${lang}/docs`]: docsSidebar(),
}
115 changes: 102 additions & 13 deletions docs/.vitepress/md-plugins/cli-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,92 @@ function escapeHtml(str: string): string {
.replace(/"/g, '&quot;')
}

// Map CLI subcommand names to their doc page paths (locale-independent)
const CLI_COMMAND_MAP: Record<string, string> = {
// Market Data
quote: '/docs/cli/market-data/quote',
depth: '/docs/cli/market-data/depth',
kline: '/docs/cli/market-data/kline',
trades: '/docs/cli/market-data/trades',
brokers: '/docs/cli/market-data/brokers',
intraday: '/docs/cli/market-data/intraday',
static: '/docs/cli/market-data/static',
'market-temp': '/docs/cli/market-data/market-temp',
'calc-index': '/docs/cli/market-data/calc-index',
capital: '/docs/cli/market-data/capital',
trading: '/docs/cli/market-data/trading',
participants: '/docs/cli/market-data/participants',
'security-list': '/docs/cli/market-data/security-list',
subscriptions: '/docs/cli/market-data/subscriptions',
// Derivatives
option: '/docs/cli/derivatives/option',
warrant: '/docs/cli/derivatives/warrant',
// Content
news: '/docs/cli/content/news',
topic: '/docs/cli/content/topic',
topics: '/docs/cli/content/topic',
filing: '/docs/cli/content/filing',
// Watchlist
watchlist: '/docs/cli/watchlist/watchlist',
// Account
assets: '/docs/cli/account/assets',
positions: '/docs/cli/account/positions',
'fund-positions': '/docs/cli/account/fund-positions',
'cash-flow': '/docs/cli/account/cash-flow',
portfolio: '/docs/cli/account/portfolio',
// Orders
order: '/docs/cli/orders/order',
orders: '/docs/cli/orders/order',
buy: '/docs/cli/orders/order',
sell: '/docs/cli/orders/order',
cancel: '/docs/cli/orders/order',
replace: '/docs/cli/orders/order',
executions: '/docs/cli/orders/order',
'max-qty': '/docs/cli/orders/max-qty',
'margin-ratio': '/docs/cli/orders/margin-ratio',
'exchange-rate': '/docs/cli/orders/exchange-rate',
}

function getLocalePrefix(localeIndex: string): string {
switch (localeIndex) {
case 'zh-CN': return '/zh-CN'
case 'zh-HK': return '/zh-HK'
default: return ''
}
}

function getInstallLabel(localeIndex: string): string {
function getInstallTitle(localeIndex: string): string {
switch (localeIndex) {
case 'zh-CN': return '安装 CLI'
case 'zh-HK': return '安裝 CLI'
default: return 'Install CLI'
}
}

function getInstallUrl(localeIndex: string): string {
function getUsageTitle(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'
case 'zh-CN': return 'CLI 使用文档'
case 'zh-HK': return 'CLI 使用文件'
default: return 'CLI Usage Docs'
}
}

function getInstallUrl(localeIndex: string): string {
return `${getLocalePrefix(localeIndex)}/docs/cli/installation`
}

function extractFirstCommand(content: string): string | null {
for (const line of content.split('\n')) {
const trimmed = line.trim()
if (!trimmed || trimmed.startsWith('#')) continue
const parts = trimmed.split(/\s+/)
if (parts[0] === 'longbridge' && parts[1]) return parts[1]
}
return null
}

function getUsageUrl(cmd: string): string | null {
return CLI_COMMAND_MAP[cmd] ?? null
}

// Colors matching github-light / github-dark shiki themes (auto-switch via CSS vars)
Expand Down Expand Up @@ -67,44 +138,62 @@ function renderLine(line: string): string {
return html + '</span>'
}

function generateCliBlock(content: string, installLabel: string, installUrl: string): string {
// Inline SVG icons for the CLI header
const ICON_TERMINAL = `<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>`
const ICON_BOOK = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>`
const ICON_DOWNLOAD = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>`

function generateCliBlock(content: string, installTitle: string, installUrl: string, usageTitle: string, usageUrl: string | null): string {
const lines = content
.split('\n')
.map(renderLine)
.filter(Boolean)
.join('\n')

const usageBtn = usageUrl
? `<a href="${usageUrl}" class="vp-cli-action" title="${escapeHtml(usageTitle)}" aria-label="${escapeHtml(usageTitle)}">${ICON_BOOK}</a>`
: ''
const installBtn = `<a href="${installUrl}" class="vp-cli-action" title="${escapeHtml(installTitle)}" aria-label="${escapeHtml(installTitle)}">${ICON_DOWNLOAD}</a>`

return (
`<div class="vp-cli-command">` +
`<h2>CLI<a href="${installUrl}" class="vp-cli-install-link">${escapeHtml(installLabel)}</a></h2>` +
`<div class="vp-cli-header">` +
`<span class="vp-cli-badge">${ICON_TERMINAL}<span>CLI</span></span>` +
`<div class="vp-cli-actions">${usageBtn}${installBtn}</div>` +
`</div>` +
`<div class="language-bash vp-adaptive-theme">` +
`<span class="lang">bash</span>` +
`<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0">` +
`<code>${lines}</code></pre></div>` +
`</div>`
)
}

function replaceCliCommand(src: string, installLabel: string, installUrl: string): string {
function replaceCliCommand(src: string, installTitle: string, installUrl: string, usageTitle: string, localeIndex: string): string {
return src.replace(
/<CliCommand>([\s\S]*?)<\/CliCommand>/g,
(_, content: string) => generateCliBlock(content.trim(), installLabel, installUrl),
(_, content: string) => {
const trimmed = content.trim()
const cmd = extractFirstCommand(trimmed)
const usageUrl = cmd ? getUsageUrl(cmd) : null
return generateCliBlock(trimmed, installTitle, installUrl, usageTitle, usageUrl)
},
)
}

export function CliCommandPlugin(md: MarkdownIt) {
md.core.ruler.push('cli_command', (state) => {
const localeIndex: string = state.env?.localeIndex ?? 'root'
const installLabel = getInstallLabel(localeIndex)
const installTitle = getInstallTitle(localeIndex)
const installUrl = getInstallUrl(localeIndex)
const usageTitle = getUsageTitle(localeIndex)

let i = 0
while (i < state.tokens.length) {
const token = state.tokens[i]

// Case 1: already an html_block (e.g. multiline <CliCommand>)
if (token.type === 'html_block' && token.content.includes('<CliCommand>')) {
token.content = replaceCliCommand(token.content, installLabel, installUrl)
token.content = replaceCliCommand(token.content, installTitle, installUrl, usageTitle, localeIndex)
i++
continue
}
Expand All @@ -116,7 +205,7 @@ export function CliCommandPlugin(md: MarkdownIt) {
state.tokens[i + 1].content.includes('<CliCommand>') &&
state.tokens[i + 2]?.type === 'paragraph_close'
) {
const replaced = replaceCliCommand(state.tokens[i + 1].content, installLabel, installUrl)
const replaced = replaceCliCommand(state.tokens[i + 1].content, installTitle, installUrl, usageTitle, localeIndex)
const htmlToken = new state.Token('html_block', '', 0)
htmlToken.content = replaced
state.tokens.splice(i, 3, htmlToken)
Expand Down
6 changes: 3 additions & 3 deletions docs/.vitepress/theme/layouts/Layout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ const { llmMarkdownLink } = useLLMMarkdownLink()
</template>

<template #doc-footer-before>
<a v-if="llmMarkdownLink" :href="llmMarkdownLink" target="_blank" class="llms-text-link"
>LLMs Text</a
>
<a v-if="llmMarkdownLink" :href="llmMarkdownLink" target="_blank" class="llms-text-link" title="LLMs Text">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right:6px"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/></svg>Markdown
</a>
</template>
</Layout>
</template>
Expand Down
Loading
Loading