Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
105 changes: 88 additions & 17 deletions _layouts/doc.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
{%- assign page_title = page.title | append: " — " | append: site.title -%}
{%- assign page_desc = page.description | default: site.description -%}
{%- assign page_kw = page.keywords | default: site.keywords -%}
Expand Down Expand Up @@ -52,23 +52,33 @@
--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: var(--font-sans); color: var(--ink); line-height: 1.6; background: var(--canvas); }
body { font-family: var(--font-sans); color: var(--ink); line-height: 1.6; background: var(--canvas); overflow-x: hidden; }
h1, h2, h3 { text-wrap: balance; }
.doc-content p, .doc-content li { text-wrap: pretty; }

/* Nav */
.nav { background: var(--canvas); border-bottom: 1px solid var(--hairline); height: 64px; display: flex; align-items: center; position: sticky; top: 0; z-index: 100; backdrop-filter: blur(8px); background: rgba(255,255,255,0.8); }
.nav { border-bottom: 1px solid var(--hairline); height: calc(64px + env(safe-area-inset-top, 0px)); padding-top: env(safe-area-inset-top, 0px); display: flex; align-items: center; position: sticky; top: 0; z-index: 100; backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); background: rgba(255,255,255,0.8); }
.nav-inner { max-width: 1100px; margin: 0 auto; padding: 0 24px; width: 100%; display: flex; align-items: center; justify-content: space-between; }
.nav-logo { font-size: 16px; font-weight: 700; color: var(--ink); text-decoration: none; letter-spacing: -0.5px; }
.logo-short { display: none; }
.nav-links { display: flex; gap: 8px; align-items: center; }
.nav-links a { color: var(--body); text-decoration: none; font-size: 14px; font-weight: 500; padding: 6px 12px; border-radius: var(--rounded-pill); transition: background 0.15s, color 0.15s; }
.nav-links a:hover { background: var(--canvas-soft-2); color: var(--ink); }
.nav-cta { background: var(--primary) !important; color: var(--on-primary) !important; font-size: 14px !important; font-weight: 500; padding: 6px 16px !important; border-radius: var(--rounded-sm); }
.nav-cta:hover { opacity: 0.9; background: var(--primary) !important; }
.nav-toggle { display: none; align-items: center; justify-content: center; width: 44px; height: 44px; border: none; background: none; cursor: pointer; border-radius: var(--rounded-md); color: var(--ink); }
.nav-toggle:hover { background: var(--canvas-soft-2); }
.nav-toggle svg { width: 22px; height: 22px; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.nav-toggle .icon-close { display: none; }
.nav-toggle[aria-expanded="true"] .icon-menu { display: none; }
.nav-toggle[aria-expanded="true"] .icon-close { display: block; }
.menu-backdrop { display: none; }

/* Doc layout */
.doc-layout { display: grid; grid-template-columns: 220px 1fr; max-width: 1100px; margin: 0 auto; min-height: calc(100vh - 64px); }
.doc-layout { display: grid; grid-template-columns: 220px minmax(0, 1fr); max-width: 1100px; margin: 0 auto; min-height: calc(100vh - 64px); }

/* Sidebar */
.sidebar { border-right: 1px solid var(--hairline); padding: 32px 0 32px 24px; position: sticky; top: 64px; height: calc(100vh - 64px); overflow-y: auto; }
.sidebar { border-right: 1px solid var(--hairline); padding: 32px 0 32px 24px; position: sticky; top: calc(64px + env(safe-area-inset-top, 0px)); height: calc(100vh - 64px - env(safe-area-inset-top, 0px)); overflow-y: auto; }
.sidebar-section { margin-bottom: 24px; }
.sidebar-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--mute); margin-bottom: 8px; padding-left: 12px; }
.sidebar a { display: block; font-size: 14px; color: var(--body); text-decoration: none; padding: 6px 12px; border-radius: var(--rounded-sm); margin-bottom: 2px; transition: all 0.12s; border-left: 2px solid transparent; }
Expand All @@ -85,11 +95,12 @@
.doc-content a:hover { text-decoration: underline; }
.doc-content ul, .doc-content ol { padding-left: 20px; margin-bottom: 16px; }
.doc-content li { font-size: 15px; color: var(--body); line-height: 26px; margin-bottom: 8px; }
.doc-content code { font-family: var(--font-mono); font-size: 13px; background: var(--canvas-soft-2); padding: 2px 6px; border-radius: 4px; color: var(--ink); }
.doc-content code { font-family: var(--font-mono); font-size: 13px; background: var(--canvas-soft-2); padding: 2px 6px; border-radius: 4px; color: var(--ink); overflow-wrap: anywhere; }
.doc-content pre { background: var(--primary); color: var(--on-primary); padding: 20px 24px; border-radius: var(--rounded-md); margin-bottom: 20px; overflow-x: auto; font-size: 13px; line-height: 22px; }
.doc-content pre code { background: none; padding: 0; color: inherit; }
.doc-content blockquote { border-left: 3px solid var(--hairline); padding-left: 16px; margin: 16px 0; color: var(--mute); font-style: italic; }
.doc-content table { width: 100%; border-collapse: collapse; margin: 16px 0 24px; font-size: 14px; }
.table-wrap { overflow-x: auto; margin: 16px 0 24px; }
.doc-content table { width: 100%; border-collapse: collapse; font-size: 14px; }
.doc-content th { text-align: left; font-weight: 600; padding: 10px 12px; border-bottom: 2px solid var(--hairline); color: var(--ink); }
.doc-content td { padding: 10px 12px; border-bottom: 1px solid var(--hairline); color: var(--body); }
.doc-content tr:hover td { background: var(--canvas-soft); }
Expand All @@ -107,44 +118,79 @@

/* Code copy button */
.code-block-wrapper { position: relative; margin-bottom: 20px; }
.code-block-wrapper pre { margin-bottom: 0; padding-right: 48px; }
.copy-btn { position: absolute; top: 50%; right: 12px; transform: translateY(-50%); background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.2); color: rgba(255,255,255,0.7); width: 32px; height: 32px; border-radius: 6px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s, color 0.15s; }
.code-block-wrapper pre { margin-bottom: 0; }
.copy-btn { position: absolute; top: 8px; right: 8px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.5); width: 32px; height: 32px; border-radius: 6px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s, color 0.15s, opacity 0.15s; opacity: 0; }
.code-block-wrapper:hover .copy-btn, .copy-btn:focus { opacity: 1; }
.copy-btn:hover { background: rgba(255,255,255,0.25); color: #fff; }
.copy-btn.copied { background: rgba(34,197,94,0.3); border-color: rgba(34,197,94,0.4); color: #4ade80; }
.copy-btn.copied { opacity: 1; background: rgba(34,197,94,0.3); border-color: rgba(34,197,94,0.4); color: #4ade80; }
.copy-btn svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
@media (hover: none) { .copy-btn { opacity: 0.6; } }

/* Page footer */
.doc-footer { margin-top: 64px; padding-top: 24px; border-top: 1px solid var(--hairline); font-size: 13px; color: var(--mute); }
.doc-footer a { color: var(--link); text-decoration: none; }
.doc-footer a:hover { text-decoration: underline; }

/* Tablet */
@media (max-width: 1024px) {
.doc-layout { grid-template-columns: 200px minmax(0, 1fr); }
.doc-content { padding: 40px 32px 72px; }
}

/* Mobile */
@media (max-width: 768px) {
.doc-layout { grid-template-columns: 1fr; }
.sidebar { display: none; }
.doc-content { padding: 32px 24px 60px; }
.doc-content h1 { font-size: 26px; }
.nav-links a:not(.nav-cta) { display: none; }
.nav-links a { display: none; }
.nav-toggle { display: flex; }
.logo-full { display: none; }
.logo-short { display: inline; }
.menu-backdrop.open { display: block; position: fixed; inset: 0; z-index: 98; background: rgba(23,23,23,0.24); }
.doc-layout { grid-template-columns: minmax(0, 1fr); }
.sidebar { position: fixed; top: calc(64px + env(safe-area-inset-top, 0px)); left: 0; bottom: 0; height: auto; width: min(300px, 84vw); padding: 20px 12px calc(20px + env(safe-area-inset-bottom, 0px)); background: var(--canvas); transform: translateX(-102%); transition: transform 0.28s cubic-bezier(0.32, 0.72, 0, 1); z-index: 99; }
.sidebar.open { transform: translateX(0); box-shadow: 16px 0 48px rgba(23,23,23,0.12); }
.sidebar a { display: flex; align-items: center; min-height: 44px; padding: 10px 12px; font-size: 15px; }
.doc-content { padding: 28px 20px calc(56px + env(safe-area-inset-bottom, 0px)); }
.doc-content h1, .blog-meta-title { font-size: 26px; }
.doc-content h2 { font-size: 20px; }
.doc-content pre { padding: 16px 18px; }
.doc-content code { font-size: 12.5px; }
.doc-content table { font-size: 13px; }
.doc-content th, .doc-content td { padding: 8px 10px; }
.doc-content td img { max-width: 64px; height: auto; }
.doc-content blockquote { padding-left: 12px; margin: 12px 0; }
.blog-meta-desc { padding: 12px 14px; }
}

@media (pointer: coarse) {
.copy-btn { width: 40px; height: 40px; top: 6px; right: 6px; }
}

@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}
</style>
</head>
<body>

<nav class="nav">
<div class="nav-inner">
<a href="/" class="nav-logo">ModelStudio for Developers</a>
<a href="/" class="nav-logo"><span class="logo-full">ModelStudio for Developers</span><span class="logo-short">ModelStudio</span></a>
<div class="nav-links">
<a href="/playbook/">岗位能力样板</a>
<a href="/blog/">Blog</a>
<a href="/showcase/">案例</a>
<a href="https://github.com/modelstudioai" target="_blank">GitHub</a>
<a href="{{ site.bailian_apikey_url }}" class="nav-cta" target="_blank">获取 API Key</a>
<button class="nav-toggle" aria-label="菜单" aria-expanded="false" aria-controls="doc-sidebar">
<svg class="icon-menu" viewBox="0 0 24 24"><line x1="4" y1="7" x2="20" y2="7"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="17" x2="20" y2="17"/></svg>
<svg class="icon-close" viewBox="0 0 24 24"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>
</button>
</div>
</div>
</nav>
<div class="menu-backdrop"></div>

<div class="doc-layout">
<aside class="sidebar">
<aside class="sidebar" id="doc-sidebar">
<div class="sidebar-section">
<div class="sidebar-title">文档</div>
<a href="/guide/" {% if page.url == '/guide/' %}class="active"{% endif %}>完整教程</a>
Expand Down Expand Up @@ -200,6 +246,31 @@ <h1 class="blog-meta-title">{{ page.title }}</h1>

<script>
document.addEventListener('DOMContentLoaded', function() {
var toggle = document.querySelector('.nav-toggle');
var sidebar = document.getElementById('doc-sidebar');
var backdrop = document.querySelector('.menu-backdrop');
if (toggle && sidebar && backdrop) {
function setDrawer(open) {
sidebar.classList.toggle('open', open);
backdrop.classList.toggle('open', open);
toggle.setAttribute('aria-expanded', String(open));
toggle.setAttribute('aria-label', open ? '关闭菜单' : '菜单');
document.body.style.overflow = open ? 'hidden' : '';
}
toggle.addEventListener('click', function() { setDrawer(!sidebar.classList.contains('open')); });
backdrop.addEventListener('click', function() { setDrawer(false); });
sidebar.addEventListener('click', function(e) { if (e.target.closest('a')) setDrawer(false); });
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') setDrawer(false); });
window.addEventListener('resize', function() { if (window.innerWidth > 768) setDrawer(false); });
}

document.querySelectorAll('.doc-content table').forEach(function(table) {
var wrap = document.createElement('div');
wrap.className = 'table-wrap';
table.parentNode.insertBefore(wrap, table);
wrap.appendChild(table);
});

var pres = document.querySelectorAll('.doc-content pre');
pres.forEach(function(pre) {
var wrapper = document.createElement('div');
Expand Down
Loading