specleaf 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/lib/assets/ui.css +1 -1
- package/lib/cli.js +49 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -75,6 +75,8 @@ management/
|
|
|
75
75
|
|
|
76
76
|
每个模块独立解析,保留各自的 OpenAPI 版本、服务地址、鉴权、tags 和引用作用域,支持共享引用、同名模型及同路径接口。缺少 tags 的接口归入“未分组”。目录搜索和方法筛选覆盖**全部模块**,可按模块路径、标题或接口关键词搜索。跨模块打开接口时保留搜索、筛选和分组展开状态;正文概览的统计和导出作用于当前模块,字段树、响应、媒体类型和示例等详情状态会重置。
|
|
77
77
|
|
|
78
|
+
路径文件可以反向引用主入口中的参数、响应、请求体和模型,例如 `paths/items.yaml` 中的 `../openapi.yaml#/components/parameters/Page`。生成时会按引用原文件的路径归并为内部引用,保留递归模型;示例、默认值和扩展数据中的字面 `$ref` 不会改写。此行为也适用于单文件入口。
|
|
79
|
+
|
|
78
80
|
模块概览链接为 `#/module/<编码后的模块ID>/overview`,接口链接为 `#/module/<编码后的模块ID>/operation/<编码后的接口ID>`;每个 ID 整体通过 `encodeURIComponent` 编码,例如 `merchant/orders` 变成 `merchant%2Forders`。链接可复制、刷新和前进后退,未知模块或接口显示无效链接状态。单文件输入继续使用原来的 `#/overview` 和 `#/operation/<编码后的接口ID>`。
|
|
79
81
|
|
|
80
82
|
导出得到当前模块合并后的 OpenAPI JSON,文件名为 `openapi-<编码后的模块ID>.json`;根模块为 `openapi-..json`。单文件仍导出 `openapi.json`。模块集合和所需资源全部内嵌,断网后也能浏览全部模块、搜索和导出。
|
|
@@ -131,7 +133,7 @@ npm pack
|
|
|
131
133
|
mkdir ../specleaf-consumer
|
|
132
134
|
cd ../specleaf-consumer
|
|
133
135
|
npm init -y
|
|
134
|
-
npm install --omit=dev --ignore-scripts ../specleaf/specleaf-1.1.
|
|
136
|
+
npm install --omit=dev --ignore-scripts ../specleaf/specleaf-1.1.2.tgz
|
|
135
137
|
npm exec -- specleaf ../specleaf/examples/minimal.json -o ./api.html
|
|
136
138
|
npx specleaf --version
|
|
137
139
|
```
|
|
@@ -214,6 +216,7 @@ CI 在 Linux、macOS 和 Windows 上分别使用 Node.js 22.19.0 与 24 运行
|
|
|
214
216
|
|
|
215
217
|
```text
|
|
216
218
|
build/contract.ts 本地契约解析、模块发现、统一加载与错误上下文
|
|
219
|
+
build/references.ts 引用来源追踪、入口返回引用归并与离线引用检查
|
|
217
220
|
build/openapi-plugin.ts 开发模式虚拟模块和引用监听
|
|
218
221
|
build/serialize.ts HTML JSON 数据块的安全序列化
|
|
219
222
|
build/package.ts 预编译 ESM CLI、通用 IIFE、CSS 和图标
|
package/lib/assets/ui.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:root{color:#282936;font-synthesis:none;--purple:#7656dd;--purple-light:#f2edff;--muted:#9293a1;--border:#edeef2;--sidebar:274px;--header:66px;background:#fff;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:default;opacity:.5}button{color:inherit}a{color:var(--purple);text-decoration:none}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,pre:focus-visible{outline-offset:3px;outline:2px solid #9c83eb}button{background:0 0;border:0}button,select,a{touch-action:manipulation}svg{flex-shrink:0}code,kbd,pre{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}p{line-height:1.85}h1,h2,h3,p{margin-top:0}h1{letter-spacing:-.7px;font-size:32px;font-weight:650;line-height:1.4}h2{letter-spacing:-.3px;font-size:19px;font-weight:650}h3{font-size:14px;font-weight:600}::selection{background:#e5dafa}select{color:#5e5d6e;background:#fff;border:1px solid #e4e5eb;border-radius:6px;max-width:100%;padding:6px 25px 6px 10px;font-size:14px}summary{cursor:pointer;line-height:1.7}.muted{color:var(--muted)}.rotated{transform:rotate(90deg)}.icon-button{color:#9a9aa7;border-radius:5px;justify-content:center;align-items:center;padding:4px;display:inline-flex}.icon-button:hover{color:var(--purple);background:var(--purple-light)}.skip-link{background:var(--purple);color:#fff;z-index:100;padding:12px;position:fixed;top:-60px;left:12px}.skip-link:focus{top:8px}.topbar{height:var(--header);border-bottom:1px solid var(--border);z-index:30;background:#fffffffa;align-items:center;gap:50px;padding:0 27px;display:flex;position:fixed;top:0;left:0;right:0}.brand{color:#242330;white-space:nowrap;align-items:center;gap:10px;min-width:0;max-width:40%;font-size:18px;font-weight:650;display:flex}.brand-name{text-overflow:ellipsis;overflow:hidden}.brand-symbol{background:var(--purple);color:#fff;border-radius:10px;justify-content:center;align-items:center;width:33px;height:33px;display:flex;box-shadow:0 3px 8px #7357e825}.brand-divider{color:#d3d0dc;margin:0 13px;font-size:22px;font-weight:300}.brand-docs{color:#777582;letter-spacing:.4px;font-size:13px;font-weight:400}.top-nav{align-items:center;gap:30px;height:100%;display:flex}.top-nav>a{color:#5e5c6e;align-items:center;height:100%;font-size:13px;display:flex;position:relative}.top-nav>a.active{color:var(--purple);font-weight:600}.top-nav>a.active:after{content:"";background:var(--purple);height:2px;position:absolute;bottom:0;left:0;right:0}.top-nav>button{color:#898694;align-items:center;gap:7px;padding:6px;font-size:14px;display:flex}.top-nav>button:hover{color:var(--purple)}.header-right{align-items:center;gap:22px;margin-left:auto;display:flex}.version-pill{border:1px solid var(--border);color:#777785;white-space:nowrap;border-radius:5px;align-items:center;gap:7px;padding:5px 9px;font-family:Consolas,monospace;font-size:13px;display:flex}.version-pill>span,.status-dot{background:#59b292;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.help-link{color:#9594a2;align-items:center;display:flex}.mobile-menu,.close-drawer,.drawer-backdrop{display:none}.sidebar{top:var(--header);width:var(--sidebar);border-right:1px solid var(--border);z-index:25;background:#fcfcfe;flex-direction:column;display:flex;position:fixed;bottom:0;left:0}.sidebar-tools{flex-shrink:0;padding:24px 17px 0}.search-scope{color:#92909e;margin:0 3px 8px;font-size:12px}.workspace-label{align-items:center;gap:10px;margin-bottom:23px;padding:0 5px;display:flex}.workspace-icon{color:#8265d4;background:#f0ecfc;border:1px solid #e9e2fa;border-radius:7px;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.workspace-label>div{overflow-wrap:anywhere;flex-direction:column;gap:4px;min-width:0;display:flex}.workspace-label strong{letter-spacing:.3px;font-size:13px;font-weight:600}.workspace-label>div>span{color:#a0a0ae;letter-spacing:.6px;font-size:12px}.desktop-chevron{color:#aaa7b5;margin-left:auto}.search-box{color:#aaa8b5;background:#fff;border:1px solid #e6e6ec;border-radius:6px;align-items:center;gap:8px;height:36px;padding:0 9px;display:flex;box-shadow:0 2px 3px #25213e02}.search-box:focus-within{border-color:#b2a0e5;box-shadow:0 0 0 2px #7656dd0b}.search-box input{color:#4b485d;background:0 0;border:0;flex:1;width:100%;min-width:0;padding:0;font-size:13px;outline:none!important}.search-box input::placeholder{color:#a4a2ae}.search-box kbd{color:#a5a2b1;white-space:nowrap;border:1px solid #eeedf1;border-radius:3px;align-items:center;gap:2px;padding:2px 3px;font-size:11px;display:flex}.method-filter{color:#a3a0ad;align-items:center;gap:4px;padding:11px 3px 18px;display:flex}.method-filter select{color:#92909e;background:0 0;border:0;max-width:112px;padding:0 0 0 3px;font-size:12px}.method-filter>span{color:#a5a3b0;margin-left:auto;font-size:12px}.sidebar-scroll{scrollbar-width:thin;scrollbar-color:#dedbe7 transparent;overscroll-behavior:contain;flex:1;padding:0 13px 25px;overflow:auto}.module-group+.module-group{border-top:1px solid var(--border);margin-top:14px;padding-top:14px}.module-heading{color:#6b657b;border-radius:6px;align-items:center;gap:9px;margin-bottom:3px;padding:9px;display:flex}.module-heading:hover,.module-heading.current-module{color:var(--purple);background:#f0ecfa}.module-heading>svg{flex-shrink:0}.module-heading>span:first-of-type{flex:1;min-width:0}.module-heading strong{overflow-wrap:anywhere;font-size:13px;line-height:1.5;display:block}.module-heading small{color:#92909e;text-overflow:ellipsis;white-space:nowrap;margin-top:3px;font-size:11px;display:block;overflow:hidden}.module-group .group-toggle{min-height:32px;font-size:12px}.module-empty{color:#92909e;padding:8px 12px;font-size:12px}.overview-link{color:#777282;border-radius:5px;align-items:center;gap:10px;height:39px;padding:0 13px;font-size:14px;display:flex}.overview-link.selected{color:var(--purple);background:#eee8fa;font-weight:600}.overview-link>svg:last-child{width:12px;margin-left:auto}.nav-caption{color:#b1adbc;letter-spacing:.6px;justify-content:space-between;padding:25px 12px 13px;font-size:12px;display:flex}.nav-caption>span{color:#b9b5c2;letter-spacing:0;font-size:11px}.group-toggle{color:#6b657b;text-align:left;border-radius:5px;align-items:center;gap:7px;width:100%;min-height:39px;padding:5px 9px;font-size:14px;display:flex}.group-toggle:hover{background:#f2eff7}.group-toggle>svg{color:#a5a0b2}.group-toggle>svg:first-child{color:#b4aebf;transition:transform .15s}.group-count{color:#aaa5b8;margin-left:auto;font-family:Consolas,monospace;font-size:12px}.group-operations{margin:0 0 6px;padding:1px 0 3px}.operation-link{color:#80798e;border-radius:5px;align-items:center;gap:9px;min-height:35px;margin:2px 0;padding:6px 9px 6px 20px;font-size:13px;display:flex}.operation-link-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.operation-link:hover{background:#f2eff8}.operation-link.selected{color:#7656cc;background:#eee8fa;font-weight:500}.method{letter-spacing:-.2px;flex-shrink:0;min-width:35px;font-family:Consolas,SFMono-Regular,monospace;font-size:12px;font-weight:700;display:inline-block}.method-get{color:#35a37e}.method-post{color:#d4a02d}.method-patch{color:#9b70d5}.method-put{color:#518dcc}.method-delete{color:#e7777e}.method-head,.method-options,.method-trace{color:#7b89ad}.api-status-draft{--api-status-color:#626776;--api-status-background:#f0f1f4}.api-status-developing{--api-status-color:#7656cc;--api-status-background:#f2edff}.api-status-testing{--api-status-color:#326db0;--api-status-background:#edf4fc}.api-status-released{--api-status-color:#247a57;--api-status-background:#eaf6ef}.api-status-deprecated{--api-status-color:#966016;--api-status-background:#fcf3e3}.api-status-dot{background:var(--api-status-color);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-left:auto}.sidebar-footer{border-top:1px solid var(--border);color:#a29dab;white-space:nowrap;align-items:center;gap:6px;height:47px;padding:0 18px;font-size:11px;display:flex}.sidebar-footer>.status-dot{background:#ad9bd7;width:5px;height:5px}.sidebar-footer>span:last-child{color:#bbb6c4;margin-left:auto;font-size:10px}.search-empty{color:#8b8394;flex-direction:column;align-items:center;gap:10px;padding:40px 10px;font-size:13px;display:flex}.search-empty svg{color:#b8accb}.search-empty strong{color:#7c718d;font-weight:500}.search-empty button{color:var(--purple);margin-top:7px;font-size:13px}.page-shell{margin-left:var(--sidebar);padding-top:var(--header);max-width:1730px;display:flex}.page-shell main{outline:none;flex:1;min-width:0;max-width:1160px;padding:30px 55px 0}.breadcrumb{color:#96919e;overflow-wrap:anywhere;flex-wrap:wrap;align-items:center;gap:9px;margin-bottom:40px;font-size:12px;display:flex}.breadcrumb>span:last-child{color:#80768e}.breadcrumb svg{color:#c2bdca}.page-outline{border-left:1px solid var(--border);flex-direction:column;flex-shrink:0;align-self:flex-start;gap:2px;width:180px;margin-top:115px;margin-right:28px;padding:0 0 0 20px;font-size:13px;display:flex;position:sticky;top:106px}.page-outline>span{color:#5d546d;margin-bottom:14px;font-size:12px;font-weight:600}.page-outline>button{text-align:left;color:#94899f;padding:4px 0;font-size:12px;line-height:2.1;position:relative}.page-outline>button:hover,.page-outline>button.current{color:var(--purple)}.page-outline>button.current:before{content:"";background:var(--purple);width:2px;height:22px;position:absolute;top:4px;left:-21px}.outline-note{color:#9c90ae;background:#fcfaff;border:1px solid #eeeaf5;border-radius:7px;margin-top:37px;padding:14px 12px}.outline-note svg{color:#ac97d3;margin-bottom:10px;display:block}.outline-note strong{color:#8f7da7;font-size:12px;font-weight:500}.outline-note p{margin:7px 0 0;font-size:12px;line-height:1.8}.eyebrow{color:#9689aa;letter-spacing:1.2px;align-items:center;gap:8px;margin-bottom:17px;font-size:12px;font-weight:500;display:flex}.eyebrow>span:first-child:not(:last-child){background:#a58bdc;border-radius:50%;width:5px;height:5px}.eyebrow .hero-badge{letter-spacing:.4px;color:#a38bbd;background:#f6f3fb;border:1px solid #eee8f6;border-radius:4px;margin-left:4px;padding:3px 6px;font-family:inherit;font-size:11px}.overview-hero h1{color:#302c3b;letter-spacing:-1px;margin-bottom:14px;font-size:34px}.heading-mark{color:#9473d8;margin-left:3px}.hero-lead{color:#726b7e;letter-spacing:.2px;margin-bottom:17px;font-size:14px}.overview-hero>.markdown{color:#85808e;max-width:760px;font-size:13px;line-height:1.95}.hero-actions{align-items:center;gap:12px;margin:25px 0 32px;display:flex}.primary-button,.secondary-button{border-radius:6px;justify-content:center;align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:500;line-height:1.4;display:inline-flex}.primary-button{background:var(--purple);border:1px solid var(--purple);color:#fff;box-shadow:0 3px 5px #7656dd12}.primary-button:hover{background:#6546cd}.secondary-button{color:#81748f;background:#fff;border:1px solid #e6e1ed}.secondary-button:hover{background:#faf8fe}.hero-actions>span{color:#97909f;align-items:center;gap:5px;margin-left:3px;font-size:12px;display:flex}.hero-actions>span svg{color:#a7b5a7}.stats-grid{background:linear-gradient(120deg,#fdfcff,#fff);border:1px solid #ebe7f0;border-radius:8px;grid-template-columns:repeat(3,1fr);margin-bottom:39px;padding:23px 0;display:grid}.stats-grid>div{align-items:center;gap:15px;padding:0 26px;display:flex}.stats-grid>div+div{border-left:1px solid #ebe7f0}.stat-icon{border-radius:10px;justify-content:center;align-items:center;width:39px;height:39px;display:flex}.purple{color:#9878d7;background:#f3eefc}.blue{color:#7c9ace;background:#eef3fc}.green{color:#7cae9e;background:#edf7f2}.stats-grid>div>div{flex-direction:column;gap:4px;display:flex}.stats-grid strong{color:#4d445e;font-variant-numeric:tabular-nums;font-size:25px;font-weight:600;line-height:1.1}.stats-grid strong small{color:#8e879a;margin-left:6px;font-family:inherit;font-size:12px;font-weight:400}.stats-grid>div>div>span{color:#8c8598;letter-spacing:.4px;font-size:12px}.doc-section{min-width:0;margin-bottom:35px;scroll-margin-top:90px}.section-heading{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:18px;display:flex}.section-heading h2{color:#38323f;margin:0;font-size:17px}.section-heading>span:last-child:not(.count-badge):not(.required){color:#9b94a7;margin-left:7px;font-size:12px}.count-badge{color:#ad98c5;background:#f4f0fa;border-radius:4px;padding:2px 6px;font-family:Consolas,monospace;font-size:12px;line-height:1.3;display:inline-block}.getting-started{border:1px solid #ebe7f0;border-radius:8px;grid-template-columns:1fr 1.05fr;display:grid;overflow:hidden}.start-steps{padding:24px 23px 7px}.start-steps>div{gap:13px;margin-bottom:20px;display:flex}.start-steps>div>span{color:#b19acb;background:#fbf8ff;border:1px solid #e8e0f3;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:26px;height:26px;font-family:Consolas,monospace;font-size:12px;display:flex}.start-steps strong{color:#645b71;font-size:13px;font-weight:500;line-height:1.7}.start-steps p{color:#97909f;margin:4px 0 0;font-size:12px;line-height:1.8}.start-example{background:#fcfaff;border-left:1px solid #eee8f4;flex-direction:column;justify-content:center;min-width:0;padding:22px 20px;display:flex}.example-caption{color:#9890a4;align-items:center;gap:6px;margin-bottom:15px;font-size:12px;display:flex}.example-caption>.status-dot{background:#b8a2d2;width:5px;height:5px}.start-example .code-block{background:#f7f3fc;border-color:#eae2f3}.start-example .code-toolbar{background:0 0;border-color:#ede5f5;padding:10px;font-size:11px}.start-example .code-toolbar>span{font-size:11px}.start-example pre{min-height:72px;padding:16px 11px;font-size:12px}.start-example>a{color:#8a73a3;align-self:flex-end;align-items:center;gap:5px;margin-top:14px;font-size:12px;display:flex}.group-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:13px;display:grid}.group-card{text-align:left;background:#fff;border:1px solid #ede8f3;border-radius:8px;align-items:flex-start;gap:14px;padding:20px 18px;transition:border-color .15s,box-shadow .15s;display:flex}.group-card:hover{border-color:#cdb9e7;box-shadow:0 4px 15px #76608e08}.group-card-icon{border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;display:flex}.tone-0{color:#aa90cc;background:#f5effc}.tone-1{color:#839fcf;background:#f0f4fb}.tone-2{color:#87b4a2;background:#eff7f2}.tone-3{color:#c4a580;background:#fcf6ed}.group-card-copy{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.group-card-title{color:#595063;flex-wrap:wrap;align-items:center;gap:10px;font-size:14px;font-weight:600;display:flex}.group-card-title>code{color:#88808f;font-size:11px;font-weight:400}.group-card-copy>.markdown{color:#89828f;font-size:12px;line-height:1.5}.group-card-copy>small{color:#a29aaa;margin-top:2px;font-size:11px}.group-card>svg{color:#c3b3d0;margin-top:10px}.convention-grid{border:1px solid #ede8f3;border-radius:8px;grid-template-columns:1fr 1fr;gap:35px;padding:23px;display:grid}.convention-grid>div>svg{color:#b49bcc;margin-bottom:10px}.convention-grid h3{color:#72617e;margin-bottom:10px;font-size:13px}.convention-grid p,.convention-grid .markdown{color:#88808f;margin:8px 0 0;font-size:12px;line-height:1.85}.convention-grid code{color:#a490b7;background:#f8f4fc;border-radius:3px;padding:3px 7px;font-size:13px}.info-callout{color:#8b779a;background:#fcfaff;border:1px solid #eee8f6;border-radius:7px;gap:12px;margin-top:18px;padding:17px 19px;display:flex}.info-callout>svg{margin-top:2px}.info-callout>div{width:100%;min-width:0}.info-callout strong{font-size:13px;font-weight:500}.info-callout p{color:#9a91a4;margin:6px 0;font-size:12px}.info-callout .raw-details{margin:8px 0 0;font-size:12px}.page-footer{border-top:1px solid var(--border);color:#a29ba8;flex-wrap:wrap;justify-content:space-between;gap:15px;margin-top:45px;padding:24px 0 30px;font-size:11px;display:flex}.footer-dot{margin:0 8px}.not-found{text-align:center;color:#9e89b1;padding:70px 0}.not-found h1{margin-top:18px;font-size:27px}.not-found p{color:#b2a5bd;font-size:14px}.not-found a{align-items:center;gap:7px;font-size:14px;display:inline-flex}.operation-header{margin-bottom:30px;scroll-margin-top:90px}.operation-header .eyebrow{letter-spacing:.5px;color:#ae9dc1;margin-bottom:15px}.operation-header .eyebrow>span{font-size:12px}.title-row{justify-content:space-between;align-items:center;gap:15px;margin-bottom:14px;display:flex}.title-row h1{overflow-wrap:anywhere;color:#302b3d;min-width:0;margin:0;font-size:29px}.operation-badges{overflow-wrap:anywhere;flex-wrap:wrap;align-items:center;gap:7px;margin-bottom:22px;display:flex}.doc-badge,.tag-badge,.api-status-badge{border-radius:4px;align-items:center;gap:4px;padding:3px 6px;font-size:11px;line-height:1.5;display:inline-flex}.doc-badge{color:#a78abb;background:#f5effc;border:1px solid #ede2f6}.tag-badge{color:#ad9cbb;background:#f7f5fa}.api-status-badge{color:var(--api-status-color);background:var(--api-status-background);white-space:nowrap}.endpoint-bar{background:#faf8fe;border:1px solid #eae2f3;border-radius:7px;align-items:center;gap:13px;margin-bottom:20px;padding:14px 15px;display:flex}.endpoint-bar .method{letter-spacing:0;background:#fff;border:1px solid #e9e6ed;border-radius:4px;min-width:auto;padding:4px 8px;font-size:13px}.endpoint-bar>code{color:#897298;overflow-wrap:anywhere;min-width:0;font-size:14px;line-height:1.6}.endpoint-bar .copy-button{flex-shrink:0;margin-left:auto}.operation-header>.markdown{color:#7c7385;font-size:14px}.server-line{color:#9e93a8;flex-wrap:wrap;align-items:center;gap:8px;margin-top:14px;font-size:12px;display:flex}.server-line code{color:#a38cb6;overflow-wrap:anywhere;background:#f8f4fc;border-radius:3px;min-width:0;padding:3px 6px}.external-doc-link{align-items:center;gap:5px;margin-top:7px;font-size:13px;display:inline-flex}.auth-public{color:#8db29b;background:#f9fcfa;border:1px solid #e6eee9;border-radius:7px;flex-wrap:wrap;align-items:center;gap:9px;padding:15px 17px;font-size:13px;display:flex}.auth-public strong{font-weight:500}.auth-public>span{color:#adbdaf;margin-left:5px;font-size:12px}.helper-text{color:#9f8dab;margin:10px 0 13px;font-size:12px;line-height:1.9}.auth-option{border:1px solid #eae3f1;border-radius:7px;align-items:flex-start;gap:15px;margin-top:10px;padding:15px 17px;display:flex}.auth-option-label{color:#a58ab9;white-space:nowrap;background:#f7f1fc;border-radius:4px;padding:3px 7px;font-size:11px}.auth-scheme{min-width:0}.auth-scheme>div:first-child{color:#8e74a1;flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.auth-scheme strong{font-weight:500}.auth-scheme>div>code{color:#baa3cd;font-size:12px}.auth-scheme>.markdown,.auth-scheme p{color:#9d8bad;margin:7px 0 0;font-size:12px}.auth-scheme p code{color:#a88ebd}.parameter-group{margin-bottom:20px}.parameter-group h3{color:#ad9bbe;align-items:center;gap:6px;font-size:12px;display:flex}.parameter-group h3>span:first-child{color:#a88abb}.parameter-group h3>.muted{font-weight:400}.empty-note{color:#9988a8;overflow-wrap:anywhere;background:#fdfbff;border:1px dashed #e7dfef;border-radius:7px;align-items:center;gap:10px;padding:20px 17px;font-size:13px;display:flex}.empty-note code{font-size:12px}.copy-button{color:#a58db8;white-space:nowrap;border-radius:4px;justify-content:center;align-items:center;gap:5px;padding:5px 7px;font-size:12px;display:inline-flex}.copy-button:hover{color:#8b6bae;background:#f1e8fa}.copy-button.icon-only{padding:4px}.copy-button [role=status]{font-size:12px}.schema-table{background:#fff;border:1px solid #ebe3f2;border-radius:7px;min-width:0;overflow:hidden}.schema-head,.schema-row{grid-template-columns:minmax(140px,1.05fr) minmax(105px,.8fr) 48px minmax(160px,1.7fr);align-items:start;display:grid}.schema-head{color:#8f7e9c;background:#faf7fd;border-bottom:1px solid #ece5f4;font-size:12px}.schema-head>span{padding:12px}.schema-row{color:#8b759a;min-height:49px;font-size:12px;line-height:1.7}.schema-row+.schema-row{border-top:1px solid #f0eaf5}.schema-row>[role=cell]{overflow-wrap:anywhere;min-width:0;padding:12px}.schema-row>[role=cell].field-name{align-items:center;gap:3px;display:flex}.field-name>code{color:#786585;overflow-wrap:anywhere;font-size:12px}.expand-field{color:#b8a1c9;flex-shrink:0;justify-content:center;align-items:center;width:17px;height:19px;padding:0;display:flex}.expand-field:hover{color:var(--purple);background:#f6effb;border-radius:3px}.expand-field svg{transition:transform .15s}.field-spacer{flex-shrink:0;width:17px}.schema-root{background:#fdfbff}.field-type{flex-direction:column;gap:4px;display:flex}.field-type>code{color:#9a80ac;font-size:11px}.field-type>span{color:#ac98ba;overflow-wrap:anywhere;font-size:10px}.required{color:#ce939f;white-space:nowrap;font-size:11px}.optional{color:#d1c3db;font-size:12px}.field-description{color:#8b7a9a}.field-description>.markdown{font-size:12px;line-height:1.8}.field-description>.markdown>p{margin:0}.field-description>strong{margin-bottom:5px;font-size:12px;font-weight:500;display:block}.constraint-summary{color:#a08cae;flex-wrap:wrap;gap:2px 12px;margin-top:4px;font-size:11px;display:flex}.constraint-summary>span{overflow-wrap:anywhere;min-width:0}.constraint-summary code{font-size:inherit;color:#9275a7;white-space:pre-wrap}.constraint-details{margin-top:5px;font-size:11px}.constraint-details>summary{cursor:pointer;color:#9275a7}.constraint-details>summary:focus-visible{outline-offset:3px;border-radius:2px;outline:2px solid #7357e8}.constraints{color:#a08cae;flex-direction:column;gap:3px;margin-top:5px;font-size:11px;display:flex}.constraints>div{min-width:0}.constraints code{color:#9275a7;overflow-wrap:anywhere;white-space:pre-wrap;font-size:11px}.reference-note{color:#a084b1;background:#f6effb;border-radius:3px;margin-top:4px;padding:3px 5px;font-size:11px;display:inline-block}.media-controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:3px 0 15px;display:flex}.media-controls label{color:#8d7f99;align-items:center;gap:9px;min-width:0;font-size:12px;display:flex}.media-controls select{color:#84738f;background:#fefcff;border-color:#e8dff0;font-size:12px}.source-note{color:#aaa0b2;font-size:11px}.example-heading{justify-content:space-between;align-items:center;gap:12px;margin:20px 0 11px;display:flex}.example-heading>select{color:#ae94c0;border-color:#e8deef;max-width:55%;padding:5px 20px 5px 8px;font-size:11px}.small-tabs{align-items:center;gap:18px;display:flex}.small-tabs>button{color:#a18cb0;padding:3px 0 6px;font-size:12px;position:relative}.small-tabs>button.active{color:#8763a3;font-weight:500}.small-tabs>button.active:after{content:"";background:#b99dce;border-radius:2px;height:2px;position:absolute;bottom:0;left:0;right:0}.code-block{background:#faf6fd;border:1px solid #e8dff0;border-radius:7px;min-width:0;overflow:hidden}.code-toolbar{background:#f9f4fd;border-bottom:1px solid #ece3f4;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;display:flex}.code-toolbar>span{color:#a084b1;overflow-wrap:anywhere;align-items:center;gap:5px;min-width:0;font-size:11px;display:flex}.code-toolbar .copy-button{color:#9c7daf;font-size:11px}.code-block pre{tab-size:2;color:#8b779d;scrollbar-width:thin;scrollbar-color:#e4d4ee transparent;max-height:510px;margin:0;padding:18px;font-size:13px;line-height:1.9;overflow:auto}.code-key{color:#815fa3}.code-string{color:#5e8f7d}.code-value{color:#af825b}.raw-details{color:#9b7dae;border:1px solid #ece3f2;border-radius:6px;margin:13px 0;font-size:12px;overflow:hidden}.raw-details>summary{color:#9b7dae;overflow-wrap:anywhere;background:#fcf9ff;padding:11px 13px}.raw-details>.code-block,.raw-details>.media-panel{margin:12px}.parameter-serialization{color:#b49ac6;border-bottom:1px solid #f4eef8;flex-wrap:wrap;gap:10px;padding:10px 5px;font-size:11px;display:flex}.parameter-serialization>span{color:#c2afd0}.parameter-serialization code{font-size:11px}.response-panel{border:1px solid #ebe2f3;border-radius:8px;overflow:hidden}.status-tabs{background:#fcfaff;border-bottom:1px solid #ece4f3;gap:4px;padding:0 12px;display:flex;overflow:auto}.status-tabs>button{color:#a18bb1;flex-shrink:0;align-items:center;gap:5px;padding:14px 10px;font-size:12px;display:flex;position:relative}.status-tabs>button.active{color:#8e6da8;background:#f8f2fc}.status-tabs>button.active:after{content:"";background:#b89ace;height:2px;position:absolute;bottom:0;left:0;right:0}.response-dot{background:#afadce;border-radius:50%;width:5px;height:5px}.response-dot.success{background:#98baa8}.response-dot.error{background:#d1a8ad}.response-panel>[role=tabpanel]{padding:20px}.response-description{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:17px;display:flex}.response-code{color:#be9caa;background:#fcf0f4;border-radius:4px;padding:4px 7px;font-size:12px;display:inline-block}.response-code.success{color:#89af9c;background:#eff7f0}.response-description .markdown{color:#9984a8;font-size:12px}.response-description .markdown p{margin:0}.response-headers{color:#9c7fae;margin:0 0 20px;font-size:12px}.response-headers summary{padding:10px 0;line-height:1.8}.response-headers summary>span{background:#f7f1fc;border-radius:3px;margin-left:5px;padding:1px 5px;font-size:11px}.response-headers .schema-table{margin-top:5px}.policy-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:14px;display:grid}.policy-card{border:1px solid #ece2f3;border-radius:7px;overflow:hidden}.policy-card>summary{color:#8b6f9c;background:#fcf9ff;align-items:center;gap:8px;padding:13px 14px;font-size:13px;list-style:none;display:flex}.policy-card>summary::-webkit-details-marker{display:none}.policy-card>summary>code{color:#ab95b9;overflow-wrap:anywhere;font-size:10px}.policy-card>summary>svg{color:#cbb4d9;margin-left:auto}.policy-card:not([open])>summary>svg{transform:rotate(-90deg)}.policy-card dl{margin:0;padding:1px 14px 8px}.policy-card dl>div{border-top:1px solid #f3ecf8;grid-template-columns:1fr 1.05fr;align-items:start;gap:12px;padding:11px 0;display:grid}.policy-card dl>div:first-child{border:0}.policy-card dt{color:#9982aa;font-size:11px;line-height:1.6}.policy-card dt>code{color:#af99bf;overflow-wrap:anywhere;margin-top:2px;font-size:10px;display:block}.policy-card dd{color:#9175a4;overflow-wrap:anywhere;white-space:pre-wrap;margin:0;font-size:11px;line-height:1.8}.policy-card>p{color:#ad90bf;margin:0;padding:13px 14px;font-size:12px}.end-note{color:#9f8ab0;background:#fdfbff;border:1px dashed #eee3f6;border-radius:7px;align-items:center;gap:7px;margin-top:40px;padding:16px;font-size:12px;display:flex}.end-note>span{color:#c8b6d4;margin-left:auto;font-size:11px}.markdown{overflow-wrap:anywhere;color:#85748f;font-size:14px;line-height:1.85}.markdown p{margin:0 0 10px}.markdown p:last-child{margin-bottom:0}.markdown ul,.markdown ol{margin:7px 0;padding-left:20px}.markdown h1,.markdown h2,.markdown h3{margin:12px 0 8px;font-size:14px;line-height:1.6}.markdown code{overflow-wrap:anywhere;background:#f7f0fc;border-radius:3px;padding:2px 4px;font-size:.9em}.markdown pre{background:#faf5fe;border:1px solid #ede1f5;border-radius:6px;padding:14px;overflow:auto}.markdown pre>code{background:0 0;padding:0}.markdown table{border-collapse:collapse;max-width:100%;font-size:13px;display:block;overflow:auto}.markdown td,.markdown th{border:1px solid #ebe0f2;padding:7px 10px}.markdown blockquote{color:#bca1ce;border-left:3px solid #d9c4e8;margin:10px 0;padding-left:13px}.markdown img{max-width:100%;height:auto}@media (width>=1600px){.page-shell main{padding-left:70px;padding-right:70px}.page-outline{width:195px;margin-right:35px}}@media (width<=1290px){.page-outline{display:none}.page-shell main{max-width:1050px;padding-left:44px;padding-right:44px}.topbar{gap:43px}.stats-grid>div{padding:0 24px}}@media (width<=1000px){:root{--sidebar:242px}.page-shell main{padding-left:28px;padding-right:28px}.topbar{gap:35px;padding:0 22px}.brand-docs,.brand-divider{display:none}.top-nav{gap:22px}.getting-started{grid-template-columns:1fr}.start-example{border-top:1px solid #eee8f4;border-left:0}.stats-grid>div{gap:9px;padding:0 16px}.stat-icon{border-radius:8px;width:31px;height:31px}.stats-grid strong{font-size:22px}.group-cards{gap:10px}.group-card{gap:10px;padding:17px 13px}.group-card-icon{width:32px;height:32px}.group-card-title>code{display:none}.schema-head,.schema-row{grid-template-columns:minmax(105px,1fr) minmax(85px,.8fr) 38px minmax(130px,1.3fr)}.schema-row>[role=cell],.schema-head>span{padding:11px 8px}.hero-actions>span{display:none}.policy-grid{grid-template-columns:1fr}.auth-option{flex-wrap:wrap}.top-nav>button{font-size:13px}}@media (width<=800px){:root{--header:58px;--sidebar:294px}.topbar{gap:12px;padding:0 17px}.mobile-menu{color:#8c749f;padding:6px 4px;display:flex}.brand{gap:8px;font-size:16px}.brand-symbol{border-radius:8px;width:29px;height:29px}.brand-symbol svg{width:19px}.brand-docs{font-size:13px;display:inline}.brand-divider{margin:0 9px;font-size:18px;display:inline}.top-nav{display:none}.header-right{gap:0}.help-link{display:none}.version-pill{border:0;padding:5px 7px;font-size:11px}.sidebar{z-index:42;transition:transform .2s;top:0;transform:translate(-100%);box-shadow:5px 0 25px #43314d14}.sidebar.drawer-open{transform:translate(0)}.sidebar-tools{padding-top:24px}.desktop-chevron{display:none}.close-drawer{margin-left:auto;display:flex}.drawer-backdrop{z-index:40;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#34234550;display:block;position:fixed;inset:0}.page-shell{margin-left:0}.page-shell main{max-width:100%;padding:25px 28px 0}.breadcrumb{margin-bottom:30px}.overview-hero h1{font-size:30px}.stats-grid>div{padding:0 25px}.getting-started{grid-template-columns:1fr 1.1fr}.start-example{border-top:0;border-left:1px solid #eee8f4}.start-steps{padding:20px 17px 0}.group-cards{gap:12px}.group-card{padding:18px 16px}.schema-head,.schema-row{grid-template-columns:minmax(115px,1fr) minmax(90px,.8fr) 44px minmax(150px,1.6fr)}.policy-grid{grid-template-columns:1fr 1fr}.auth-option{flex-wrap:nowrap}}@media (width<=570px){.page-shell main{padding:22px 20px 0}.brand-docs,.brand-divider{display:none}.version-pill{font-size:11px}.breadcrumb{gap:7px;margin-bottom:27px;font-size:11px}.eyebrow{margin-bottom:14px;font-size:11px}.overview-hero h1{letter-spacing:-.7px;font-size:28px}.hero-lead{margin-bottom:15px;font-size:14px;line-height:1.8}.overview-hero>.markdown{font-size:13px}.hero-actions{gap:9px;margin-top:22px;margin-bottom:26px}.primary-button,.secondary-button{padding:10px 12px;font-size:12px}.stats-grid{margin-bottom:30px;padding:19px 0}.stats-grid>div{align-items:flex-start;gap:8px;padding:0 11px}.stat-icon{display:none}.stats-grid>div>div{gap:7px;padding-left:3px}.stats-grid strong{font-size:23px}.stats-grid strong small{margin-left:4px;font-size:10px}.stats-grid>div>div>span{font-size:11px}.section-heading{gap:6px;margin-bottom:15px}.section-heading h2{font-size:16px}.section-heading>span:last-child:not(.count-badge):not(.required){margin-left:3px;font-size:11px}.doc-section{margin-bottom:28px}.getting-started{grid-template-columns:1fr}.start-steps{padding:22px 21px 2px}.start-steps>div{margin-bottom:20px}.start-steps strong{font-size:14px}.start-steps p{font-size:12px}.start-example{border-top:1px solid #eee8f4;border-left:0;padding:19px 20px}.start-example pre{min-height:60px;font-size:12px}.group-cards{grid-template-columns:1fr;gap:10px}.group-card{gap:14px;padding:18px}.group-card-icon{width:36px;height:36px}.group-card-title{font-size:14px}.group-card-title>code{display:inline}.group-card-copy>.markdown{font-size:12px}.group-card-copy>small{font-size:11px}.convention-grid{grid-template-columns:1fr;gap:25px;padding:21px}.convention-grid h3{font-size:14px}.convention-grid p,.convention-grid .markdown{font-size:13px}.info-callout{gap:9px;padding:15px}.page-footer{flex-direction:column;gap:8px;margin-top:30px;padding-bottom:25px;font-size:11px}.title-row h1{font-size:25px}.title-row>.copy-button{padding:4px 0;font-size:11px}.title-row>.copy-button>span{font-size:11px}.endpoint-bar{gap:9px;padding:12px 10px}.endpoint-bar>code,.operation-header>.markdown{font-size:13px}.auth-public>span{margin:0;font-size:11px}.auth-public{gap:7px;padding:13px 12px}.auth-option{flex-direction:column;gap:10px;padding:14px}.schema-table{overflow-x:auto}.schema-head,.schema-row{grid-template-columns:145px 110px 40px minmax(230px,1.7fr);min-width:540px}.schema-row>[role=cell]{padding:11px 9px}.field-description>.markdown{font-size:12px}.response-panel>[role=tabpanel]{padding:14px 12px}.response-panel .schema-head,.response-panel .schema-row{grid-template-columns:135px 100px 37px minmax(225px,1.7fr);min-width:510px}.code-block pre{padding:15px 12px;font-size:12px}.code-toolbar{padding:7px 10px}.code-toolbar>span{font-size:10px}.media-controls{gap:7px}.media-controls label{gap:6px;font-size:11px}.media-controls select{font-size:11px}.source-note{display:none}.policy-grid{grid-template-columns:1fr}.policy-card>summary{padding:13px}.policy-card dl{padding:0 13px 7px}.policy-card dt{font-size:12px}.policy-card dt>code{font-size:11px}.policy-card dd{font-size:12px}.end-note{gap:5px;padding:13px 11px;font-size:11px}.end-note>span{display:none}.response-description{gap:7px}.empty-note{padding:17px 13px;font-size:12px;line-height:1.8}.small-tabs{gap:14px}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}.group-card-title{text-align:left;overflow-wrap:anywhere;padding:0}.group-card-copy .markdown p{margin:0}.group-card-copy .markdown strong{font-weight:600}.group-toggle>span:not(.group-count){overflow-wrap:anywhere;text-align:left;min-width:0}.overview-hero h1,.eyebrow,.page-footer,.version-pill{overflow-wrap:anywhere}.eyebrow{flex-wrap:wrap}.copy-dialog{border:1px solid var(--border);color:#42384d;border-radius:12px;width:min(560px,100vw - 32px);padding:24px;box-shadow:0 18px 80px #30203b30}.copy-dialog::backdrop{background:#34234570}.copy-dialog p{font-size:13px}.copy-dialog textarea{resize:vertical;border:1px solid #d9cee9;border-radius:6px;width:100%;min-height:140px;max-height:50vh;margin-bottom:16px;padding:12px;font:12px/1.6 SFMono-Regular,Consolas,monospace}@media (width<=800px){.brand{flex:1;max-width:none}.header-right{min-width:0;max-width:28%}.version-pill{white-space:normal}}
|
|
1
|
+
:root{color:var(--text);font-synthesis:none;--text:#28303f;--text-secondary:#465164;--purple:#6243c7;--purple-light:#f2edff;--muted:#626b7a;--code-background:#f6f7f9;--border:#edeef2;--sidebar:274px;--header:66px;background:#fff;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:default;opacity:.5}button{color:inherit}a{color:var(--purple);text-decoration:none}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,pre:focus-visible{outline:2px solid var(--purple);outline-offset:3px}button{background:0 0;border:0}button,select,a{touch-action:manipulation}svg{flex-shrink:0}code,kbd,pre{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}p{line-height:1.85}h1,h2,h3,p{margin-top:0}h1{letter-spacing:-.7px;font-size:32px;font-weight:650;line-height:1.4}h2{letter-spacing:-.3px;font-size:19px;font-weight:650}h3{font-size:14px;font-weight:600}::selection{background:#e5dafa}select{color:var(--text-secondary);background:#fff;border:1px solid #e4e5eb;border-radius:6px;max-width:100%;padding:6px 25px 6px 10px;font-size:14px}summary{cursor:pointer;line-height:1.7}.muted{color:var(--muted)}.rotated{transform:rotate(90deg)}.icon-button{color:var(--muted);border-radius:5px;justify-content:center;align-items:center;padding:4px;display:inline-flex}.icon-button:hover{color:var(--purple);background:var(--purple-light)}.skip-link{background:var(--purple);color:#fff;z-index:100;padding:12px;position:fixed;top:-60px;left:12px}.skip-link:focus{top:8px}.topbar{height:var(--header);border-bottom:1px solid var(--border);z-index:30;background:#fffffffa;align-items:center;gap:50px;padding:0 27px;display:flex;position:fixed;top:0;left:0;right:0}.brand{color:var(--text);white-space:nowrap;align-items:center;gap:10px;min-width:0;max-width:40%;font-size:18px;font-weight:650;display:flex}.brand-name{text-overflow:ellipsis;overflow:hidden}.brand-symbol{background:var(--purple);color:#fff;border-radius:10px;justify-content:center;align-items:center;width:33px;height:33px;display:flex;box-shadow:0 3px 8px #7357e825}.brand-divider{color:var(--muted);margin:0 13px;font-size:22px;font-weight:300}.brand-docs{color:var(--muted);letter-spacing:.4px;font-size:13px;font-weight:400}.top-nav{align-items:center;gap:30px;height:100%;display:flex}.top-nav>a{height:100%;color:var(--text-secondary);align-items:center;font-size:13px;display:flex;position:relative}.top-nav>a.active{color:var(--purple);font-weight:600}.top-nav>a.active:after{content:"";background:var(--purple);height:2px;position:absolute;bottom:0;left:0;right:0}.top-nav>button{color:var(--muted);align-items:center;gap:7px;padding:6px;font-size:14px;display:flex}.top-nav>button:hover{color:var(--purple)}.header-right{align-items:center;gap:22px;margin-left:auto;display:flex}.version-pill{border:1px solid var(--border);color:var(--muted);white-space:nowrap;border-radius:5px;align-items:center;gap:7px;padding:5px 9px;font-family:Consolas,monospace;font-size:13px;display:flex}.version-pill>span,.status-dot{background:#59b292;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.help-link{color:var(--muted);align-items:center;display:flex}.mobile-menu,.close-drawer,.drawer-backdrop{display:none}.sidebar{top:var(--header);width:var(--sidebar);border-right:1px solid var(--border);z-index:25;background:#fcfcfe;flex-direction:column;display:flex;position:fixed;bottom:0;left:0}.sidebar-tools{flex-shrink:0;padding:24px 17px 0}.search-scope{color:var(--muted);margin:0 3px 8px;font-size:12px}.workspace-label{align-items:center;gap:10px;margin-bottom:23px;padding:0 5px;display:flex}.workspace-icon{width:32px;height:32px;color:var(--purple);background:#f0ecfc;border:1px solid #e9e2fa;border-radius:7px;justify-content:center;align-items:center;display:flex}.workspace-label>div{overflow-wrap:anywhere;flex-direction:column;gap:4px;min-width:0;display:flex}.workspace-label strong{letter-spacing:.3px;font-size:13px;font-weight:600}.workspace-label>div>span{color:var(--muted);letter-spacing:.6px;font-size:12px}.desktop-chevron{color:var(--muted);margin-left:auto}.search-box{height:36px;color:var(--muted);background:#fff;border:1px solid #e6e6ec;border-radius:6px;align-items:center;gap:8px;padding:0 9px;display:flex;box-shadow:0 2px 3px #25213e02}.search-box:focus-within{border-color:#b2a0e5;box-shadow:0 0 0 2px #7656dd0b}.search-box input{width:100%;min-width:0;color:var(--text);background:0 0;border:0;flex:1;padding:0;font-size:13px;outline:none!important}.search-box input::placeholder{color:var(--muted)}.search-box kbd{color:var(--muted);white-space:nowrap;border:1px solid #eeedf1;border-radius:3px;align-items:center;gap:2px;padding:2px 3px;font-size:11px;display:flex}.method-filter{color:var(--muted);align-items:center;gap:4px;padding:11px 3px 18px;display:flex}.method-filter select{color:var(--muted);background:0 0;border:0;max-width:112px;padding:0 0 0 3px;font-size:12px}.method-filter>span{color:var(--muted);margin-left:auto;font-size:12px}.sidebar-scroll{scrollbar-width:thin;scrollbar-color:#dedbe7 transparent;overscroll-behavior:contain;flex:1;padding:0 13px 25px;overflow:auto}.module-group+.module-group{border-top:1px solid var(--border);margin-top:14px;padding-top:14px}.module-heading{color:var(--text-secondary);border-radius:6px;align-items:center;gap:9px;margin-bottom:3px;padding:9px;display:flex}.module-heading:hover,.module-heading.current-module{color:var(--purple);background:#f0ecfa}.module-heading>svg{flex-shrink:0}.module-heading>span:first-of-type{flex:1;min-width:0}.module-heading strong{overflow-wrap:anywhere;font-size:13px;line-height:1.5;display:block}.module-heading small{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin-top:3px;font-size:11px;display:block;overflow:hidden}.module-group .group-toggle{min-height:32px;font-size:12px}.module-empty{color:var(--muted);padding:8px 12px;font-size:12px}.overview-link{height:39px;color:var(--text-secondary);border-radius:5px;align-items:center;gap:10px;padding:0 13px;font-size:14px;display:flex}.overview-link.selected{color:var(--purple);background:#eee8fa;font-weight:600}.overview-link>svg:last-child{width:12px;margin-left:auto}.nav-caption{color:var(--muted);letter-spacing:.6px;justify-content:space-between;padding:25px 12px 13px;font-size:12px;display:flex}.nav-caption>span{color:var(--muted);letter-spacing:0;font-size:11px}.group-toggle{width:100%;min-height:39px;color:var(--text-secondary);text-align:left;border-radius:5px;align-items:center;gap:7px;padding:5px 9px;font-size:14px;display:flex}.group-toggle:hover{background:#f2eff7}.group-toggle>svg{color:var(--muted)}.group-toggle>svg:first-child{color:var(--muted);transition:transform .15s}.group-count{color:var(--muted);margin-left:auto;font-family:Consolas,monospace;font-size:12px}.group-operations{margin:0 0 6px;padding:1px 0 3px}.operation-link{min-height:35px;color:var(--text-secondary);border-radius:5px;align-items:center;gap:9px;margin:2px 0;padding:6px 9px 6px 20px;font-size:13px;display:flex}.operation-link-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.operation-link:hover{background:#f2eff8}.operation-link.selected{color:var(--purple);background:#eee8fa;font-weight:500}.method{letter-spacing:-.2px;flex-shrink:0;min-width:35px;font-family:Consolas,SFMono-Regular,monospace;font-size:12px;font-weight:700;display:inline-block}.method-get{color:#227451}.method-post{color:#855b12}.method-patch{color:var(--purple)}.method-put{color:#2865a0}.method-delete{color:#af3547}.method-head,.method-options,.method-trace{color:var(--text-secondary)}.api-status-draft{--api-status-color:#626776;--api-status-background:#f0f1f4}.api-status-developing{--api-status-color:#7656cc;--api-status-background:#f2edff}.api-status-testing{--api-status-color:#326db0;--api-status-background:#edf4fc}.api-status-released{--api-status-color:#247a57;--api-status-background:#eaf6ef}.api-status-deprecated{--api-status-color:#966016;--api-status-background:#fcf3e3}.api-status-dot{background:var(--api-status-color);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-left:auto}.sidebar-footer{border-top:1px solid var(--border);height:47px;color:var(--muted);white-space:nowrap;align-items:center;gap:6px;padding:0 18px;font-size:11px;display:flex}.sidebar-footer>.status-dot{background:#ad9bd7;width:5px;height:5px}.sidebar-footer>span:last-child{color:var(--muted);margin-left:auto;font-size:10px}.search-empty{color:var(--muted);flex-direction:column;align-items:center;gap:10px;padding:40px 10px;font-size:13px;display:flex}.search-empty svg{color:var(--muted)}.search-empty strong{color:var(--text-secondary);font-weight:500}.search-empty button{color:var(--purple);margin-top:7px;font-size:13px}.page-shell{margin-left:var(--sidebar);padding-top:var(--header);max-width:1730px;display:flex}.page-shell main{outline:none;flex:1;min-width:0;max-width:1160px;padding:30px 55px 0}.breadcrumb{color:var(--muted);overflow-wrap:anywhere;flex-wrap:wrap;align-items:center;gap:9px;margin-bottom:40px;font-size:12px;display:flex}.breadcrumb>span:last-child{color:var(--text-secondary)}.breadcrumb svg{color:var(--muted)}.page-outline{border-left:1px solid var(--border);flex-direction:column;flex-shrink:0;align-self:flex-start;gap:2px;width:180px;margin-top:115px;margin-right:28px;padding:0 0 0 20px;font-size:13px;display:flex;position:sticky;top:106px}.page-outline>span{color:var(--text-secondary);margin-bottom:14px;font-size:12px;font-weight:600}.page-outline>button{text-align:left;color:var(--muted);padding:4px 0;font-size:12px;line-height:2.1;position:relative}.page-outline>button:hover,.page-outline>button.current{color:var(--purple)}.page-outline>button.current:before{content:"";background:var(--purple);width:2px;height:22px;position:absolute;top:4px;left:-21px}.outline-note{color:var(--muted);background:#fcfaff;border:1px solid #eeeaf5;border-radius:7px;margin-top:37px;padding:14px 12px}.outline-note svg{color:var(--text-secondary);margin-bottom:10px;display:block}.outline-note strong{color:var(--text-secondary);font-size:12px;font-weight:500}.outline-note p{margin:7px 0 0;font-size:12px;line-height:1.8}.eyebrow{color:var(--muted);letter-spacing:1.2px;align-items:center;gap:8px;margin-bottom:17px;font-size:12px;font-weight:500;display:flex}.eyebrow>span:first-child:not(:last-child){background:#a58bdc;border-radius:50%;width:5px;height:5px}.eyebrow .hero-badge{letter-spacing:.4px;color:var(--purple);background:#f6f3fb;border:1px solid #eee8f6;border-radius:4px;margin-left:4px;padding:3px 6px;font-family:inherit;font-size:11px}.overview-hero h1{color:var(--text);letter-spacing:-1px;margin-bottom:14px;font-size:34px}.heading-mark{color:var(--purple);margin-left:3px}.hero-lead{color:var(--text-secondary);letter-spacing:.2px;margin-bottom:17px;font-size:14px}.overview-hero>.markdown{max-width:760px;color:var(--text-secondary);font-size:13px;line-height:1.95}.hero-actions{align-items:center;gap:12px;margin:25px 0 32px;display:flex}.primary-button,.secondary-button{border-radius:6px;justify-content:center;align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:500;line-height:1.4;display:inline-flex}.primary-button{background:var(--purple);border:1px solid var(--purple);color:#fff;box-shadow:0 3px 5px #7656dd12}.primary-button:hover{background:#5336b0}.secondary-button{color:var(--text-secondary);background:#fff;border:1px solid #e6e1ed}.secondary-button:hover{background:#faf8fe}.hero-actions>span{color:var(--muted);align-items:center;gap:5px;margin-left:3px;font-size:12px;display:flex}.hero-actions>span svg{color:var(--text-secondary)}.stats-grid{background:linear-gradient(120deg,#fdfcff,#fff);border:1px solid #ebe7f0;border-radius:8px;grid-template-columns:repeat(3,1fr);margin-bottom:39px;padding:23px 0;display:grid}.stats-grid>div{align-items:center;gap:15px;padding:0 26px;display:flex}.stats-grid>div+div{border-left:1px solid #ebe7f0}.stat-icon{border-radius:10px;justify-content:center;align-items:center;width:39px;height:39px;display:flex}.purple{color:var(--purple);background:#f3eefc}.blue{color:#2865a0;background:#eef3fc}.green{color:#23704e;background:#edf7f2}.stats-grid>div>div{flex-direction:column;gap:4px;display:flex}.stats-grid strong{color:var(--text);font-variant-numeric:tabular-nums;font-size:25px;font-weight:600;line-height:1.1}.stats-grid strong small{color:var(--muted);margin-left:6px;font-family:inherit;font-size:12px;font-weight:400}.stats-grid>div>div>span{color:var(--muted);letter-spacing:.4px;font-size:12px}.doc-section{min-width:0;margin-bottom:35px;scroll-margin-top:90px}.section-heading{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:18px;display:flex}.section-heading h2{color:var(--text);margin:0;font-size:17px}.section-heading>span:last-child:not(.count-badge):not(.required){color:var(--muted);margin-left:7px;font-size:12px}.count-badge{color:var(--purple);background:#f4f0fa;border-radius:4px;padding:2px 6px;font-family:Consolas,monospace;font-size:12px;line-height:1.3;display:inline-block}.getting-started{border:1px solid #ebe7f0;border-radius:8px;grid-template-columns:1fr 1.05fr;display:grid;overflow:hidden}.start-steps{padding:24px 23px 7px}.start-steps>div{gap:13px;margin-bottom:20px;display:flex}.start-steps>div>span{color:var(--purple);background:#fbf8ff;border:1px solid #e8e0f3;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:26px;height:26px;font-family:Consolas,monospace;font-size:12px;display:flex}.start-steps strong{color:var(--text);font-size:13px;font-weight:500;line-height:1.7}.start-steps p{color:var(--muted);margin:4px 0 0;font-size:12px;line-height:1.8}.start-example{background:#fcfaff;border-left:1px solid #eee8f4;flex-direction:column;justify-content:center;min-width:0;padding:22px 20px;display:flex}.example-caption{color:var(--muted);align-items:center;gap:6px;margin-bottom:15px;font-size:12px;display:flex}.example-caption>.status-dot{background:#b8a2d2;width:5px;height:5px}.start-example .code-block{border-color:var(--border);background:var(--code-background)}.start-example .code-toolbar{background:0 0;border-color:#ede5f5;padding:10px;font-size:11px}.start-example .code-toolbar>span{font-size:11px}.start-example pre{min-height:72px;padding:16px 11px;font-size:12px}.start-example>a{color:var(--purple);align-self:flex-end;align-items:center;gap:5px;margin-top:14px;font-size:12px;display:flex}.group-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:13px;display:grid}.group-card{text-align:left;background:#fff;border:1px solid #ede8f3;border-radius:8px;align-items:flex-start;gap:14px;padding:20px 18px;transition:border-color .15s,box-shadow .15s;display:flex}.group-card:hover{border-color:#cdb9e7;box-shadow:0 4px 15px #76608e08}.group-card-icon{border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;display:flex}.tone-0{color:var(--purple);background:#f5effc}.tone-1{color:#2865a0;background:#f0f4fb}.tone-2{color:#23704e;background:#eff7f2}.tone-3{color:#855b12;background:#fcf6ed}.group-card-copy{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.group-card-title{color:var(--text);flex-wrap:wrap;align-items:center;gap:10px;font-size:14px;font-weight:600;display:flex}.group-card-title>code{color:var(--muted);font-size:11px;font-weight:400}.group-card-copy>.markdown{color:var(--text-secondary);font-size:12px;line-height:1.5}.group-card-copy>small{color:var(--muted);margin-top:2px;font-size:11px}.group-card>svg{color:var(--muted);margin-top:10px}.convention-grid{border:1px solid #ede8f3;border-radius:8px;grid-template-columns:1fr 1fr;gap:35px;padding:23px;display:grid}.convention-grid>div>svg{color:var(--text-secondary);margin-bottom:10px}.convention-grid h3{color:var(--text);margin-bottom:10px;font-size:13px}.convention-grid p,.convention-grid .markdown{color:var(--text-secondary);margin:8px 0 0;font-size:12px;line-height:1.85}.convention-grid code{color:var(--purple);background:#f8f4fc;border-radius:3px;padding:3px 7px;font-size:13px}.info-callout{color:var(--text-secondary);background:#fcfaff;border:1px solid #eee8f6;border-radius:7px;gap:12px;margin-top:18px;padding:17px 19px;display:flex}.info-callout>svg{margin-top:2px}.info-callout>div{width:100%;min-width:0}.info-callout strong{font-size:13px;font-weight:500}.info-callout p{color:var(--text-secondary);margin:6px 0;font-size:12px}.info-callout .raw-details{margin:8px 0 0;font-size:12px}.page-footer{border-top:1px solid var(--border);color:var(--muted);flex-wrap:wrap;justify-content:space-between;gap:15px;margin-top:45px;padding:24px 0 30px;font-size:11px;display:flex}.footer-dot{margin:0 8px}.not-found{text-align:center;color:var(--text);padding:70px 0}.not-found h1{margin-top:18px;font-size:27px}.not-found p{color:var(--text-secondary);font-size:14px}.not-found a{align-items:center;gap:7px;font-size:14px;display:inline-flex}.operation-header{margin-bottom:30px;scroll-margin-top:90px}.operation-header .eyebrow{letter-spacing:.5px;color:var(--muted);margin-bottom:15px}.operation-header .eyebrow>span{font-size:12px}.title-row{justify-content:space-between;align-items:center;gap:15px;margin-bottom:14px;display:flex}.title-row h1{overflow-wrap:anywhere;color:var(--text);min-width:0;margin:0;font-size:29px}.operation-badges{overflow-wrap:anywhere;flex-wrap:wrap;align-items:center;gap:7px;margin-bottom:22px;display:flex}.doc-badge,.tag-badge,.api-status-badge{border-radius:4px;align-items:center;gap:4px;padding:3px 6px;font-size:11px;line-height:1.5;display:inline-flex}.doc-badge{color:var(--purple);background:#f5effc;border:1px solid #ede2f6}.tag-badge{color:var(--text-secondary);background:#f7f5fa}.api-status-badge{color:var(--api-status-color);background:var(--api-status-background);white-space:nowrap}.endpoint-bar{background:#faf8fe;border:1px solid #eae2f3;border-radius:7px;align-items:center;gap:13px;margin-bottom:20px;padding:14px 15px;display:flex}.endpoint-bar .method{letter-spacing:0;background:#fff;border:1px solid #e9e6ed;border-radius:4px;min-width:auto;padding:4px 8px;font-size:13px}.endpoint-bar>code{color:var(--text);overflow-wrap:anywhere;min-width:0;font-size:14px;line-height:1.6}.endpoint-bar .copy-button{flex-shrink:0;margin-left:auto}.operation-header>.markdown{color:var(--text-secondary);font-size:14px}.server-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;margin-top:14px;font-size:12px;display:flex}.server-line code{color:var(--purple);overflow-wrap:anywhere;background:#f8f4fc;border-radius:3px;min-width:0;padding:3px 6px}.external-doc-link{align-items:center;gap:5px;margin-top:7px;font-size:13px;display:inline-flex}.auth-public{color:#23704e;background:#f9fcfa;border:1px solid #e6eee9;border-radius:7px;flex-wrap:wrap;align-items:center;gap:9px;padding:15px 17px;font-size:13px;display:flex}.auth-public strong{font-weight:500}.auth-public>span{color:var(--muted);margin-left:5px;font-size:12px}.helper-text{color:var(--muted);margin:10px 0 13px;font-size:12px;line-height:1.9}.auth-option{border:1px solid #eae3f1;border-radius:7px;align-items:flex-start;gap:15px;margin-top:10px;padding:15px 17px;display:flex}.auth-option-label{color:var(--purple);white-space:nowrap;background:#f7f1fc;border-radius:4px;padding:3px 7px;font-size:11px}.auth-scheme{min-width:0}.auth-scheme>div:first-child{color:var(--text);flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.auth-scheme strong{font-weight:500}.auth-scheme>div>code{color:var(--muted);font-size:12px}.auth-scheme>.markdown,.auth-scheme p{color:var(--text-secondary);margin:7px 0 0;font-size:12px}.auth-scheme p code{color:var(--purple)}.parameter-group{margin-bottom:20px}.parameter-group h3{color:var(--text-secondary);align-items:center;gap:6px;font-size:12px;display:flex}.parameter-group h3>span:first-child{color:var(--purple)}.parameter-group h3>.muted{font-weight:400}.empty-note{color:var(--muted);overflow-wrap:anywhere;background:#fdfbff;border:1px dashed #e7dfef;border-radius:7px;align-items:center;gap:10px;padding:20px 17px;font-size:13px;display:flex}.empty-note code{font-size:12px}.copy-button{color:var(--text-secondary);white-space:nowrap;border-radius:4px;justify-content:center;align-items:center;gap:5px;padding:5px 7px;font-size:12px;display:inline-flex}.copy-button:hover,.code-toolbar .copy-button:hover{color:var(--purple);background:#f1e8fa}.copy-button.icon-only{padding:4px}.copy-button [role=status]{font-size:12px}.schema-table{background:#fff;border:1px solid #ebe3f2;border-radius:7px;min-width:0;overflow:hidden}.schema-head,.schema-row{grid-template-columns:minmax(140px,1.05fr) minmax(105px,.8fr) 48px minmax(160px,1.7fr);align-items:start;display:grid}.schema-head{color:var(--text-secondary);background:#faf7fd;border-bottom:1px solid #ece5f4;font-size:12px}.schema-head>span{padding:12px}.schema-row{color:var(--text);min-height:49px;font-size:12px;line-height:1.7}.schema-row+.schema-row{border-top:1px solid #f0eaf5}.schema-row>[role=cell]{overflow-wrap:anywhere;min-width:0;padding:12px}.schema-row>[role=cell].field-name{align-items:center;gap:3px;display:flex}.field-name>code{color:var(--text);overflow-wrap:anywhere;font-size:12px}.expand-field{width:17px;height:19px;color:var(--muted);flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.expand-field:hover{color:var(--purple);background:#f6effb;border-radius:3px}.expand-field svg{transition:transform .15s}.field-spacer{flex-shrink:0;width:17px}.schema-root{background:#fdfbff}.field-type{flex-direction:column;gap:4px;display:flex}.field-type>code{color:var(--text-secondary);font-size:11px}.field-type>span{color:var(--muted);overflow-wrap:anywhere;font-size:10px}.required{color:#ab354e;white-space:nowrap;font-size:11px}.optional{color:var(--muted);font-size:12px}.field-description{color:var(--text-secondary)}.field-description>.markdown{font-size:12px;line-height:1.8}.field-description>.markdown>p{margin:0}.field-description>strong{margin-bottom:5px;font-size:12px;font-weight:500;display:block}.constraint-summary{color:var(--muted);flex-wrap:wrap;gap:2px 12px;margin-top:4px;font-size:11px;display:flex}.constraint-summary>span{overflow-wrap:anywhere;min-width:0}.constraint-summary code{font-size:inherit;color:var(--text-secondary);white-space:pre-wrap}.constraint-details{margin-top:5px;font-size:11px}.constraint-details>summary{cursor:pointer;color:var(--purple)}.constraint-details>summary:focus-visible{outline:2px solid var(--purple);outline-offset:3px;border-radius:2px}.constraints{color:var(--muted);flex-direction:column;gap:3px;margin-top:5px;font-size:11px;display:flex}.constraints>div{min-width:0}.constraints code{color:var(--text-secondary);overflow-wrap:anywhere;white-space:pre-wrap;font-size:11px}.reference-note{color:var(--text-secondary);background:#f6effb;border-radius:3px;margin-top:4px;padding:3px 5px;font-size:11px;display:inline-block}.media-controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:3px 0 15px;display:flex}.media-controls label{color:var(--text-secondary);align-items:center;gap:9px;min-width:0;font-size:12px;display:flex}.media-controls select{color:var(--text-secondary);background:#fefcff;border-color:#e8dff0;font-size:12px}.source-note{color:var(--muted);font-size:11px}.example-heading{justify-content:space-between;align-items:center;gap:12px;margin:20px 0 11px;display:flex}.example-heading>select{color:var(--text-secondary);border-color:#e8deef;max-width:55%;padding:5px 20px 5px 8px;font-size:11px}.small-tabs{align-items:center;gap:18px;display:flex}.small-tabs>button{color:var(--text-secondary);padding:3px 0 6px;font-size:12px;position:relative}.small-tabs>button.active{color:var(--purple);font-weight:500}.small-tabs>button.active:after{content:"";background:var(--purple);border-radius:2px;height:2px;position:absolute;bottom:0;left:0;right:0}.code-block{border:1px solid var(--border);background:var(--code-background);border-radius:7px;min-width:0;overflow:hidden}.code-toolbar{border-bottom:1px solid var(--border);background:var(--code-background);justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;display:flex}.code-toolbar>span{color:var(--muted);overflow-wrap:anywhere;align-items:center;gap:5px;min-width:0;font-size:11px;display:flex}.code-toolbar .copy-button{color:var(--text-secondary);font-size:11px}.code-block pre{tab-size:2;max-height:510px;color:var(--text);scrollbar-width:thin;scrollbar-color:#c3c9d3 transparent;margin:0;padding:18px;font-size:13px;line-height:1.9;overflow:auto}.code-key{color:var(--purple)}.code-string{color:#256b4d}.code-value{color:#8a5027}.raw-details{color:var(--text-secondary);border:1px solid #ece3f2;border-radius:6px;margin:13px 0;font-size:12px;overflow:hidden}.raw-details>summary{color:var(--text-secondary);overflow-wrap:anywhere;background:#fcf9ff;padding:11px 13px}.raw-details>.code-block,.raw-details>.media-panel{margin:12px}.parameter-serialization{color:var(--muted);border-bottom:1px solid #f4eef8;flex-wrap:wrap;gap:10px;padding:10px 5px;font-size:11px;display:flex}.parameter-serialization>span{color:var(--muted)}.parameter-serialization code{font-size:11px}.response-panel{border:1px solid #ebe2f3;border-radius:8px;overflow:hidden}.status-tabs{background:#fcfaff;border-bottom:1px solid #ece4f3;gap:4px;padding:0 12px;display:flex;overflow:auto}.status-tabs>button{color:var(--text-secondary);flex-shrink:0;align-items:center;gap:5px;padding:14px 10px;font-size:12px;display:flex;position:relative}.status-tabs>button.active{color:var(--purple);background:#f8f2fc}.status-tabs>button.active:after{content:"";background:var(--purple);height:2px;position:absolute;bottom:0;left:0;right:0}.response-dot{background:#afadce;border-radius:50%;width:5px;height:5px}.response-dot.success{background:#98baa8}.response-dot.error{background:#d1a8ad}.response-panel>[role=tabpanel]{padding:20px}.response-description{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:17px;display:flex}.response-code{color:#a33b50;background:#fcf0f4;border-radius:4px;padding:4px 7px;font-size:12px;display:inline-block}.response-code.success{color:#23704e;background:#eff7f0}.response-description .markdown{color:var(--text-secondary);font-size:12px}.response-description .markdown p{margin:0}.response-headers{color:var(--text-secondary);margin:0 0 20px;font-size:12px}.response-headers summary{padding:10px 0;line-height:1.8}.response-headers summary>span{background:#f7f1fc;border-radius:3px;margin-left:5px;padding:1px 5px;font-size:11px}.response-headers .schema-table{margin-top:5px}.policy-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:14px;display:grid}.policy-card{border:1px solid #ece2f3;border-radius:7px;overflow:hidden}.policy-card>summary{color:var(--text);background:#fcf9ff;align-items:center;gap:8px;padding:13px 14px;font-size:13px;list-style:none;display:flex}.policy-card>summary::-webkit-details-marker{display:none}.policy-card>summary>code{color:var(--muted);overflow-wrap:anywhere;font-size:10px}.policy-card>summary>svg{color:var(--muted);margin-left:auto}.policy-card:not([open])>summary>svg{transform:rotate(-90deg)}.policy-card dl{margin:0;padding:1px 14px 8px}.policy-card dl>div{border-top:1px solid #f3ecf8;grid-template-columns:1fr 1.05fr;align-items:start;gap:12px;padding:11px 0;display:grid}.policy-card dl>div:first-child{border:0}.policy-card dt{color:var(--text-secondary);font-size:11px;line-height:1.6}.policy-card dt>code{color:var(--muted);overflow-wrap:anywhere;margin-top:2px;font-size:10px;display:block}.policy-card dd{color:var(--text);overflow-wrap:anywhere;white-space:pre-wrap;margin:0;font-size:11px;line-height:1.8}.policy-card>p{color:var(--text-secondary);margin:0;padding:13px 14px;font-size:12px}.end-note{color:var(--muted);background:#fdfbff;border:1px dashed #eee3f6;border-radius:7px;align-items:center;gap:7px;margin-top:40px;padding:16px;font-size:12px;display:flex}.end-note>span{color:var(--muted);margin-left:auto;font-size:11px}.markdown{overflow-wrap:anywhere;color:var(--text-secondary);font-size:14px;line-height:1.85}.markdown p{margin:0 0 10px}.markdown p:last-child{margin-bottom:0}.markdown ul,.markdown ol{margin:7px 0;padding-left:20px}.markdown h1,.markdown h2,.markdown h3{margin:12px 0 8px;font-size:14px;line-height:1.6}.markdown code{background:var(--code-background);overflow-wrap:anywhere;border-radius:3px;padding:2px 4px;font-size:.9em}.markdown pre{color:var(--text);background:var(--code-background);border:1px solid #ede1f5;border-radius:6px;padding:14px;overflow:auto}.markdown pre>code{background:0 0;padding:0}.markdown table{border-collapse:collapse;max-width:100%;font-size:13px;display:block;overflow:auto}.markdown td,.markdown th{border:1px solid #ebe0f2;padding:7px 10px}.markdown blockquote{color:var(--muted);border-left:3px solid #d9c4e8;margin:10px 0;padding-left:13px}.markdown img{max-width:100%;height:auto}@media (width>=1600px){.page-shell main{padding-left:70px;padding-right:70px}.page-outline{width:195px;margin-right:35px}}@media (width<=1290px){.page-outline{display:none}.page-shell main{max-width:1050px;padding-left:44px;padding-right:44px}.topbar{gap:43px}.stats-grid>div{padding:0 24px}}@media (width<=1000px){:root{--sidebar:242px}.page-shell main{padding-left:28px;padding-right:28px}.topbar{gap:35px;padding:0 22px}.brand-docs,.brand-divider{display:none}.top-nav{gap:22px}.getting-started{grid-template-columns:1fr}.start-example{border-top:1px solid #eee8f4;border-left:0}.stats-grid>div{gap:9px;padding:0 16px}.stat-icon{border-radius:8px;width:31px;height:31px}.stats-grid strong{font-size:22px}.group-cards{gap:10px}.group-card{gap:10px;padding:17px 13px}.group-card-icon{width:32px;height:32px}.group-card-title>code{display:none}.schema-head,.schema-row{grid-template-columns:minmax(105px,1fr) minmax(85px,.8fr) 38px minmax(130px,1.3fr)}.schema-row>[role=cell],.schema-head>span{padding:11px 8px}.hero-actions>span{display:none}.policy-grid{grid-template-columns:1fr}.auth-option{flex-wrap:wrap}.top-nav>button{font-size:13px}}@media (width<=800px){:root{--header:58px;--sidebar:294px}.topbar{gap:12px;padding:0 17px}.mobile-menu{color:var(--text-secondary);padding:6px 4px;display:flex}.brand{gap:8px;font-size:16px}.brand-symbol{border-radius:8px;width:29px;height:29px}.brand-symbol svg{width:19px}.brand-docs{font-size:13px;display:inline}.brand-divider{margin:0 9px;font-size:18px;display:inline}.top-nav{display:none}.header-right{gap:0}.help-link{display:none}.version-pill{border:0;padding:5px 7px;font-size:11px}.sidebar{z-index:42;transition:transform .2s;top:0;transform:translate(-100%);box-shadow:5px 0 25px #43314d14}.sidebar.drawer-open{transform:translate(0)}.sidebar-tools{padding-top:24px}.desktop-chevron{display:none}.close-drawer{margin-left:auto;display:flex}.drawer-backdrop{z-index:40;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#34234550;display:block;position:fixed;inset:0}.page-shell{margin-left:0}.page-shell main{max-width:100%;padding:25px 28px 0}.breadcrumb{margin-bottom:30px}.overview-hero h1{font-size:30px}.stats-grid>div{padding:0 25px}.getting-started{grid-template-columns:1fr 1.1fr}.start-example{border-top:0;border-left:1px solid #eee8f4}.start-steps{padding:20px 17px 0}.group-cards{gap:12px}.group-card{padding:18px 16px}.schema-head,.schema-row{grid-template-columns:minmax(115px,1fr) minmax(90px,.8fr) 44px minmax(150px,1.6fr)}.policy-grid{grid-template-columns:1fr 1fr}.auth-option{flex-wrap:nowrap}}@media (width<=570px){.page-shell main{padding:22px 20px 0}.brand-docs,.brand-divider{display:none}.version-pill{font-size:11px}.breadcrumb{gap:7px;margin-bottom:27px;font-size:11px}.eyebrow{margin-bottom:14px;font-size:11px}.overview-hero h1{letter-spacing:-.7px;font-size:28px}.hero-lead{margin-bottom:15px;font-size:14px;line-height:1.8}.overview-hero>.markdown{font-size:13px}.hero-actions{gap:9px;margin-top:22px;margin-bottom:26px}.primary-button,.secondary-button{padding:10px 12px;font-size:12px}.stats-grid{margin-bottom:30px;padding:19px 0}.stats-grid>div{align-items:flex-start;gap:8px;padding:0 11px}.stat-icon{display:none}.stats-grid>div>div{gap:7px;padding-left:3px}.stats-grid strong{font-size:23px}.stats-grid strong small{margin-left:4px;font-size:10px}.stats-grid>div>div>span{font-size:11px}.section-heading{gap:6px;margin-bottom:15px}.section-heading h2{font-size:16px}.section-heading>span:last-child:not(.count-badge):not(.required){margin-left:3px;font-size:11px}.doc-section{margin-bottom:28px}.getting-started{grid-template-columns:1fr}.start-steps{padding:22px 21px 2px}.start-steps>div{margin-bottom:20px}.start-steps strong{font-size:14px}.start-steps p{font-size:12px}.start-example{border-top:1px solid #eee8f4;border-left:0;padding:19px 20px}.start-example pre{min-height:60px;font-size:12px}.group-cards{grid-template-columns:1fr;gap:10px}.group-card{gap:14px;padding:18px}.group-card-icon{width:36px;height:36px}.group-card-title{font-size:14px}.group-card-title>code{display:inline}.group-card-copy>.markdown{font-size:12px}.group-card-copy>small{font-size:11px}.convention-grid{grid-template-columns:1fr;gap:25px;padding:21px}.convention-grid h3{font-size:14px}.convention-grid p,.convention-grid .markdown{font-size:13px}.info-callout{gap:9px;padding:15px}.page-footer{flex-direction:column;gap:8px;margin-top:30px;padding-bottom:25px;font-size:11px}.title-row h1{font-size:25px}.title-row>.copy-button{padding:4px 0;font-size:11px}.title-row>.copy-button>span{font-size:11px}.endpoint-bar{gap:9px;padding:12px 10px}.endpoint-bar>code,.operation-header>.markdown{font-size:13px}.auth-public>span{margin:0;font-size:11px}.auth-public{gap:7px;padding:13px 12px}.auth-option{flex-direction:column;gap:10px;padding:14px}.schema-table{overflow-x:auto}.schema-head,.schema-row{grid-template-columns:145px 110px 40px minmax(230px,1.7fr);min-width:540px}.schema-row>[role=cell]{padding:11px 9px}.field-description>.markdown{font-size:12px}.response-panel>[role=tabpanel]{padding:14px 12px}.response-panel .schema-head,.response-panel .schema-row{grid-template-columns:135px 100px 37px minmax(225px,1.7fr);min-width:510px}.code-block pre{padding:15px 12px;font-size:12px}.code-toolbar{padding:7px 10px}.code-toolbar>span{font-size:10px}.media-controls{gap:7px}.media-controls label{gap:6px;font-size:11px}.media-controls select{font-size:11px}.source-note{display:none}.policy-grid{grid-template-columns:1fr}.policy-card>summary{padding:13px}.policy-card dl{padding:0 13px 7px}.policy-card dt{font-size:12px}.policy-card dt>code{font-size:11px}.policy-card dd{font-size:12px}.end-note{gap:5px;padding:13px 11px;font-size:11px}.end-note>span{display:none}.response-description{gap:7px}.empty-note{padding:17px 13px;font-size:12px;line-height:1.8}.small-tabs{gap:14px}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}.group-card-title{text-align:left;overflow-wrap:anywhere;padding:0}.group-card-copy .markdown p{margin:0}.group-card-copy .markdown strong{font-weight:600}.group-toggle>span:not(.group-count){overflow-wrap:anywhere;text-align:left;min-width:0}.overview-hero h1,.eyebrow,.page-footer,.version-pill{overflow-wrap:anywhere}.eyebrow{flex-wrap:wrap}.copy-dialog{border:1px solid var(--border);width:min(560px,100vw - 32px);color:var(--text);border-radius:12px;padding:24px;box-shadow:0 18px 80px #30203b30}.copy-dialog::backdrop{background:#34234570}.copy-dialog p{font-size:13px}.copy-dialog textarea{color:var(--text);background:var(--code-background);resize:vertical;border:1px solid #d9cee9;border-radius:6px;width:100%;min-height:140px;max-height:50vh;margin-bottom:16px;padding:12px;font:12px/1.6 SFMono-Regular,Consolas,monospace}@media (width<=800px){.brand{flex:1;max-width:none}.header-right{min-width:0;max-width:28%}.version-pill{white-space:normal}}
|
|
2
2
|
/*$vite$:1*/
|
package/lib/cli.js
CHANGED
|
@@ -1,11 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { mkdir, readFile, readdir, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
3
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
import $RefParser from "@apidevtools/json-schema-ref-parser";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
import $RefParser, { getJsonSchemaRefParserDefaultOptions } from "@apidevtools/json-schema-ref-parser";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
// src/lib/openapi.ts
|
|
8
8
|
var pointerEscape = (value) => value.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
9
|
+
// build/references.ts
|
|
10
|
+
function rootReferenceTracker(entry, excluded) {
|
|
11
|
+
const root = pathToFileURL(entry);
|
|
12
|
+
const origins = /* @__PURE__ */ new WeakMap();
|
|
13
|
+
function remember(value, source, seen = /* @__PURE__ */ new WeakSet(), namedResource = false) {
|
|
14
|
+
if (!value || typeof value !== "object" || seen.has(value)) return;
|
|
15
|
+
seen.add(value);
|
|
16
|
+
namedResource ||= typeof value.$id === "string";
|
|
17
|
+
if (!namedResource) origins.set(value, source);
|
|
18
|
+
for (const child of Object.values(value)) remember(child, source, seen, namedResource);
|
|
19
|
+
}
|
|
20
|
+
const defaults = getJsonSchemaRefParserDefaultOptions().parse;
|
|
21
|
+
const parsers = Object.fromEntries(["json", "yaml"].map((name) => {
|
|
22
|
+
const plugin = defaults[name];
|
|
23
|
+
const parse = plugin.parse;
|
|
24
|
+
return [name, {
|
|
25
|
+
...plugin,
|
|
26
|
+
async parse(file) {
|
|
27
|
+
const value = typeof parse === "function" ? await parse.call(this, file) : parse;
|
|
28
|
+
remember(value, new URL(file.url.replace(/^([a-z]):\//i, "file:///$1:/"), root));
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
}];
|
|
32
|
+
}));
|
|
33
|
+
function internalize(document) {
|
|
34
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
35
|
+
function visit(value, path = "#") {
|
|
36
|
+
if (!value || typeof value !== "object" || excluded(path, value) || seen.has(value)) return;
|
|
37
|
+
seen.add(value);
|
|
38
|
+
if (typeof value.$ref === "string" && !value.$ref.startsWith("#")) {
|
|
39
|
+
const source = origins.get(value);
|
|
40
|
+
const target = source ? new URL(value.$ref, source) : void 0;
|
|
41
|
+
if (target && target.href.split("#")[0] === root.href) value.$ref = target.hash || "#";
|
|
42
|
+
if (!value.$ref.startsWith("#")) throw new Error(`契约合并后仍有外部引用:${path}/$ref → ${value.$ref}`);
|
|
43
|
+
}
|
|
44
|
+
for (const [key, child] of Object.entries(value)) visit(child, `${path}/${pointerEscape(key)}`);
|
|
45
|
+
}
|
|
46
|
+
visit(document);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
parsers,
|
|
50
|
+
internalize
|
|
51
|
+
};
|
|
52
|
+
}
|
|
9
53
|
// build/contract.ts
|
|
10
54
|
var DocumentationLoadError = class extends Error {
|
|
11
55
|
files;
|
|
@@ -66,9 +110,11 @@ async function loadContract(entry) {
|
|
|
66
110
|
entry = contractEntry(process.cwd(), entry);
|
|
67
111
|
const parser = new $RefParser();
|
|
68
112
|
try {
|
|
113
|
+
const references = rootReferenceTracker(entry, literalPayload);
|
|
69
114
|
const document = await parser.bundle(entry, {
|
|
70
115
|
resolve: { http: false },
|
|
71
116
|
parse: {
|
|
117
|
+
...references.parsers,
|
|
72
118
|
binary: false,
|
|
73
119
|
text: false
|
|
74
120
|
},
|
|
@@ -77,6 +123,7 @@ async function loadContract(entry) {
|
|
|
77
123
|
});
|
|
78
124
|
if (!/^3\.(0|1)\.\d+$/.test(document.openapi || "")) throw new Error(`仅支持 OpenAPI 3.0 / 3.1,当前版本:${document.openapi ?? "缺失"}`);
|
|
79
125
|
if (!document.info?.title || !document.paths || typeof document.paths !== "object" || Array.isArray(document.paths)) throw new Error("契约必须包含 info.title 和 paths 对象。");
|
|
126
|
+
references.internalize(document);
|
|
80
127
|
return {
|
|
81
128
|
document,
|
|
82
129
|
files: parser.$refs.paths(),
|