feat(docs): 视觉精修 + 枚举 displayNames 解析修复
视觉:暖纸底色+环境光晕、玻璃顶栏+渐变发丝线、宝石 logo、 渐变主按钮/强调条、描边徽标、文档淡入、弹层阴影加深 修复:tsparse 之前丢弃枚举 displayNames()——类型树出现 'Pending · Pending = 0' 重复、下拉框只有英文名; 现解析后显示 '待支付 · Pending = 0' / '待支付 (Pending)' Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
+45
-37
@@ -6,25 +6,29 @@
|
||||
<title>fun docs</title>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#f4f5f8;--panel:#ffffff;--bg2:#eef0f4;
|
||||
--line:#e4e7ed;--line2:#d4d9e1;
|
||||
--fg:#1b2230;--fg2:#5d6575;--fg3:#97a0af;
|
||||
--acc:#6366f1;--acc-strong:#4f46e5;--accbg:rgba(99,102,241,.11);
|
||||
--ok:#16a34a;--okbg:rgba(22,163,74,.12);
|
||||
--err:#dc2626;--errbg:rgba(220,38,38,.10);
|
||||
--stream:#b45309;--streambg:rgba(217,119,6,.13);
|
||||
--code-bg:#10162a;--code-fg:#d7deeb;
|
||||
--tk-key:#82aaff;--tk-str:#c3e88d;--tk-num:#f78c6c;--tk-lit:#c792ea;
|
||||
--shadow:0 1px 2px rgba(16,24,40,.05),0 4px 16px -4px rgba(16,24,40,.06);
|
||||
--bg:#f6f5f2;--panel:#fdfdfc;--bg2:#efede7;
|
||||
--line:#e5e2d9;--line2:#d3cfc4;
|
||||
--fg:#1a1c22;--fg2:#535a67;--fg3:#a29d91;
|
||||
--acc:#5f56e8;--acc-strong:#4e44dd;--accbg:rgba(95,86,232,.10);
|
||||
--acc2:#a855f7;
|
||||
--grad:linear-gradient(135deg,#6366f1,#a855f7);
|
||||
--ok:#17894c;--okbg:rgba(23,137,76,.11);
|
||||
--err:#d43d3d;--errbg:rgba(212,61,61,.09);
|
||||
--stream:#b45f09;--streambg:rgba(196,109,9,.12);
|
||||
--code-bg:#12141f;--code-fg:#d8deea;
|
||||
--tk-key:#8fa8ff;--tk-str:#b8e086;--tk-num:#f0986e;--tk-lit:#c79af0;
|
||||
--shadow:0 1px 2px rgba(28,24,48,.05),0 8px 24px -8px rgba(28,24,48,.09);
|
||||
--mono:ui-monospace,SFMono-Regular,'SF Mono',Menlo,Consolas,monospace;
|
||||
}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
html,body{height:100%}
|
||||
body{background:var(--bg);color:var(--fg);font:14px/1.65 -apple-system,'Segoe UI',system-ui,'PingFang SC','Microsoft YaHei',sans-serif;display:flex;flex-direction:column;overflow:hidden}
|
||||
body{background:radial-gradient(1100px 480px at 88% -12%,rgba(99,102,241,.07),transparent 62%),radial-gradient(820px 420px at -12% 105%,rgba(168,85,247,.05),transparent 60%),var(--bg);color:var(--fg);font:14px/1.65 -apple-system,'Segoe UI',system-ui,'PingFang SC','Microsoft YaHei',sans-serif;display:flex;flex-direction:column;overflow:hidden}
|
||||
::selection{background:var(--accbg)}
|
||||
/* 顶栏 */
|
||||
header{display:flex;align-items:center;gap:10px;height:52px;padding:0 18px;background:var(--panel);border-bottom:1px solid var(--line);flex-shrink:0}
|
||||
header .logo{font-family:var(--mono);font-weight:700;font-size:15px;letter-spacing:-.01em}
|
||||
header{display:flex;align-items:center;gap:10px;height:52px;padding:0 18px;background:rgba(253,253,252,.82);backdrop-filter:blur(14px) saturate(1.4);border-bottom:1px solid var(--line);flex-shrink:0;position:relative}
|
||||
header::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--grad);opacity:.8}
|
||||
header .logo{font-family:var(--mono);font-weight:700;font-size:15px;letter-spacing:-.01em;display:flex;align-items:center;gap:9px}
|
||||
.mark{display:inline-block;width:14px;height:14px;border-radius:4.5px;background:var(--grad);box-shadow:0 2px 8px rgba(99,102,241,.45),inset 0 1px 0 rgba(255,255,255,.4);transform:rotate(45deg) scale(.82);flex-shrink:0}
|
||||
header .logo b{color:var(--acc);font-weight:700}
|
||||
header .meta{color:var(--fg3);font-size:12.5px}
|
||||
.spacer{flex:1}
|
||||
@@ -44,35 +48,36 @@ aside{width:272px;min-width:272px;border-right:1px solid var(--line);display:fle
|
||||
.svc .cnt{font-family:var(--mono);font-weight:600;font-size:10px;color:var(--fg3);background:var(--bg2);border-radius:8px;padding:0 6px;line-height:16px}
|
||||
.mth{display:flex;align-items:center;gap:7px;padding:5px 10px;border-radius:8px;cursor:pointer;font-size:13.5px;color:var(--fg2);transition:background .12s,color .12s;position:relative}
|
||||
.mth:hover{background:var(--bg2);color:var(--fg)}
|
||||
.mth.on{background:var(--accbg);color:var(--fg)}
|
||||
.mth.on::before{content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:16px;background:var(--acc);border-radius:0 3px 3px 0}
|
||||
.mth.on{background:linear-gradient(90deg,var(--accbg),transparent 150%);color:var(--fg)}
|
||||
.mth.on::before{content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:16px;background:var(--grad);border-radius:0 3px 3px 0}
|
||||
.mth .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:13px}
|
||||
.mth.on .nm{font-weight:600;color:var(--acc-strong)}
|
||||
.badge{font-size:9px;padding:0 5px;border-radius:6px;font-family:var(--mono);font-weight:600;letter-spacing:.04em;line-height:15px}
|
||||
.b-stream{color:var(--stream);background:var(--streambg)}
|
||||
.b-stream{color:var(--stream);background:var(--streambg);border:1px solid rgba(196,109,9,.2)}
|
||||
/* 正文 */
|
||||
main{flex:1;overflow-y:auto;padding:30px 40px 90px}
|
||||
.doc{max-width:880px}
|
||||
.doc{max-width:880px;animation:docin .38s cubic-bezier(.22,.8,.36,1) both}
|
||||
@keyframes docin{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
|
||||
.crumb{font-size:12px;color:var(--fg3);font-family:var(--mono);margin-bottom:6px}
|
||||
.titlerow{display:flex;align-items:center;gap:14px}
|
||||
.titlerow>div{min-width:0;flex:1}
|
||||
h1{font-size:23px;font-weight:700;letter-spacing:-.02em;font-family:var(--mono);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
|
||||
h1{font-size:24px;font-weight:700;letter-spacing:-.02em;font-family:var(--mono);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
|
||||
.tag{font-size:10.5px;font-weight:600;padding:2px 9px;border-radius:9px;font-family:var(--mono);letter-spacing:.02em}
|
||||
.t-stream{color:var(--stream);background:var(--streambg)}
|
||||
.endpoint{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:16px 0 8px;padding:11px 14px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);font-family:var(--mono);font-size:12.5px;color:var(--fg2)}
|
||||
.t-stream{color:var(--stream);background:var(--streambg);border:1px solid rgba(196,109,9,.22)}
|
||||
.endpoint{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:16px 0 8px;padding:12px 15px;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);font-family:var(--mono);font-size:12.5px;color:var(--fg2)}
|
||||
.http-method{background:var(--ok);color:#fff;font-weight:700;font-size:10.5px;padding:2.5px 8px;border-radius:6px;letter-spacing:.06em}
|
||||
.endpoint .path{color:var(--fg);font-weight:600}
|
||||
.endpoint .sep{color:var(--line2)}
|
||||
.endpoint b{color:var(--acc-strong);font-weight:600}
|
||||
h2{font-size:15px;font-weight:650;margin:32px 0 12px;display:flex;align-items:baseline;gap:8px}
|
||||
h2::before{content:'';align-self:center;width:4px;height:14px;border-radius:2px;background:var(--acc);flex-shrink:0}
|
||||
h2::before{content:'';align-self:center;width:4px;height:14px;border-radius:2px;background:var(--grad);flex-shrink:0}
|
||||
h2 .sub{font-weight:400;color:var(--fg3);font-size:12px;margin-left:2px}
|
||||
/* 参数表 */
|
||||
.tbl{border:1px solid var(--line);border-radius:10px;background:var(--panel);box-shadow:var(--shadow)}
|
||||
.tbl{border:1px solid var(--line);border-radius:12px;background:var(--panel);box-shadow:var(--shadow)}
|
||||
table.params{width:100%;border-collapse:collapse;font-size:13px}
|
||||
table.params tr:first-child th:first-child{border-top-left-radius:10px}
|
||||
table.params tr:first-child th:last-child{border-top-right-radius:10px}
|
||||
table.params th{text-align:left;color:var(--fg3);font-weight:600;font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:8px 12px;background:var(--bg2);border-bottom:1px solid var(--line);white-space:nowrap}
|
||||
table.params tr:first-child th:first-child{border-top-left-radius:12px}
|
||||
table.params tr:first-child th:last-child{border-top-right-radius:12px}
|
||||
table.params th{text-align:left;color:var(--fg3);font-weight:600;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;padding:9px 13px;background:var(--bg2);border-bottom:1px solid var(--line);white-space:nowrap}
|
||||
table.params td{padding:8px 12px;border-bottom:1px solid var(--line);vertical-align:top}
|
||||
table.params tr:last-child>td{border-bottom:none}
|
||||
table.params td.name{font-family:var(--mono);white-space:nowrap;font-size:12.5px}
|
||||
@@ -92,7 +97,7 @@ textarea{min-height:56px;resize:vertical}
|
||||
.xsel-label.ph{color:var(--fg3)}
|
||||
.xsel-btn>svg{width:12px;height:12px;color:var(--fg3);flex-shrink:0;transition:transform .15s}
|
||||
.xselect.open .xsel-btn>svg{transform:rotate(180deg)}
|
||||
.xsel-pop{display:none;position:absolute;z-index:60;top:calc(100% + 4px);left:0;right:0;background:var(--panel);border:1px solid var(--line);border-radius:9px;box-shadow:0 10px 28px -8px rgba(16,24,40,.22),0 2px 6px rgba(16,24,40,.08);padding:4px;max-height:230px;overflow:auto}
|
||||
.xsel-pop{display:none;position:absolute;z-index:60;top:calc(100% + 5px);left:0;right:0;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 14px 34px -10px rgba(28,24,48,.25),0 2px 6px rgba(28,24,48,.08);padding:5px;max-height:230px;overflow:auto}
|
||||
.xselect.up .xsel-pop{top:auto;bottom:calc(100% + 4px)}
|
||||
.xselect.open .xsel-pop{display:block}
|
||||
.xopt{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;font-size:12.5px;font-family:var(--mono);color:var(--fg);cursor:pointer;user-select:none}
|
||||
@@ -106,9 +111,9 @@ textarea{min-height:56px;resize:vertical}
|
||||
/* 发送 */
|
||||
#sendBar{display:flex;gap:10px;align-items:center;margin:4px 0 4px}
|
||||
.btn{border:none;border-radius:8px;padding:8px 22px;font-size:13.5px;font-weight:600;cursor:pointer;transition:all .15s}
|
||||
#send{background:var(--acc);color:#fff;box-shadow:0 1px 2px rgba(0,0,0,.12)}
|
||||
#send:hover{background:var(--acc-strong)}
|
||||
#send:active{transform:translateY(1px)}
|
||||
#send{background:var(--grad);color:#fff;box-shadow:0 2px 10px -2px rgba(99,102,241,.5),0 1px 2px rgba(0,0,0,.08)}
|
||||
#send:hover{box-shadow:0 5px 18px -3px rgba(99,102,241,.6);transform:translateY(-1px)}
|
||||
#send:active{transform:translateY(0)}
|
||||
#send:disabled{opacity:.55;cursor:wait}
|
||||
#send.stop{background:var(--err)}
|
||||
.ghost{background:var(--panel);border:1px solid var(--line);color:var(--fg2);border-radius:8px;padding:7px 14px;cursor:pointer;font-size:12.5px;font-weight:500;transition:all .15s}
|
||||
@@ -128,10 +133,10 @@ textarea{min-height:56px;resize:vertical}
|
||||
.block{border:1px solid var(--line);border-radius:12px;margin-top:8px;overflow:hidden;box-shadow:var(--shadow)}
|
||||
.bhead{display:flex;align-items:center;gap:8px;padding:8px 14px;background:var(--panel);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:12px;color:var(--fg2)}
|
||||
.chips{display:flex;align-items:center;gap:8px;flex:1;min-width:0;flex-wrap:wrap}
|
||||
.chip{padding:1.5px 9px;border-radius:9px;font-weight:600;font-size:11px;white-space:nowrap}
|
||||
.c-ok{color:var(--ok);background:var(--okbg)}
|
||||
.c-err{color:var(--err);background:var(--errbg)}
|
||||
.c-info{color:var(--acc-strong);background:var(--accbg)}
|
||||
.chip{padding:1.5px 9px;border-radius:9px;font-weight:600;font-size:11px;white-space:nowrap;border:1px solid transparent}
|
||||
.c-ok{color:var(--ok);background:var(--okbg);border-color:rgba(23,137,76,.18)}
|
||||
.c-err{color:var(--err);background:var(--errbg);border-color:rgba(212,61,61,.18)}
|
||||
.c-info{color:var(--acc-strong);background:var(--accbg);border-color:rgba(95,86,232,.2)}
|
||||
textarea.body{width:100%;border:none;outline:none;background:var(--code-bg);padding:15px 17px;font-family:var(--mono);font-size:12.5px;line-height:1.65;overflow:auto;min-height:120px;max-height:50vh;white-space:pre;resize:vertical;color:var(--code-fg);display:block;border-radius:0}
|
||||
textarea.body:focus{box-shadow:none}
|
||||
pre.body{padding:15px 17px;font-family:var(--mono);font-size:12.5px;line-height:1.65;overflow:auto;max-height:50vh;white-space:pre-wrap;word-break:break-all;color:var(--code-fg);background:var(--code-bg)}
|
||||
@@ -153,7 +158,7 @@ pre.body{padding:15px 17px;font-family:var(--mono);font-size:12.5px;line-height:
|
||||
.tnode:hover{text-decoration:underline}
|
||||
.tnode .caret{width:9px;color:var(--fg3);transition:transform .15s;display:inline-block;font-size:10px}
|
||||
.tnode.open .caret{transform:rotate(90deg)}
|
||||
.tkids{display:none;margin:2px 0 2px 7px;padding-left:9px;border-left:1px solid var(--line);font-size:11.5px;line-height:1.75}
|
||||
.tkids{display:none;margin:2px 0 2px 7px;padding-left:9px;border-left:1px solid rgba(95,86,232,.22);font-size:11.5px;line-height:1.75}
|
||||
.tnode.open+.tkids{display:block}
|
||||
.tkids .tkids{display:block}
|
||||
.tkid{color:var(--fg);white-space:nowrap}
|
||||
@@ -164,7 +169,7 @@ pre.body{padding:15px 17px;font-family:var(--mono);font-size:12.5px;line-height:
|
||||
::-webkit-scrollbar-thumb{background:var(--line2);border-radius:5px;border:2px solid var(--bg)}
|
||||
::-webkit-scrollbar-thumb:hover{background:var(--fg3)}
|
||||
#empty{margin-top:22vh;text-align:center;color:var(--fg3)}
|
||||
#empty .eico{width:46px;height:46px;margin:0 auto 14px;border:1px dashed var(--line2);border-radius:12px;display:flex;align-items:center;justify-content:center;color:var(--fg3)}
|
||||
#empty .eico{width:48px;height:48px;margin:0 auto 14px;border:1px solid var(--line);border-radius:14px;display:flex;align-items:center;justify-content:center;color:var(--acc);background:var(--panel);box-shadow:var(--shadow)}
|
||||
#empty .eico svg{width:22px;height:22px}
|
||||
#empty p{font-size:13.5px}
|
||||
#empty .kbd{margin-left:4px}
|
||||
@@ -172,7 +177,7 @@ pre.body{padding:15px 17px;font-family:var(--mono);font-size:12.5px;line-height:
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<span class="logo">Fun <b>API Docs</b></span>
|
||||
<span class="logo"><i class="mark"></i>Fun <b>API Docs</b></span>
|
||||
<span class="meta" id="hmeta"></span>
|
||||
<span class="spacer"></span>
|
||||
</header>
|
||||
@@ -445,7 +450,10 @@ function typeCellHTML(t){
|
||||
}
|
||||
function typeKids(t){
|
||||
if(!t)return '';
|
||||
if(t.kind==='enum')return (t.names||[]).map((n,i)=>`<div class="tkid">${esc((t.displayNames&&t.displayNames[i])?t.displayNames[i]:n)}<span class="tv"> · ${esc(n)} = ${i}</span></div>`).join('');
|
||||
if(t.kind==='enum')return (t.names||[]).map((n,i)=>{
|
||||
const d=t.displayNames&&t.displayNames[i];
|
||||
return `<div class="tkid">${d&&d!==n?esc(d)+'<span class="tv"> · </span>':''}${esc(n)}<span class="tv"> = ${i}</span></div>`;
|
||||
}).join('');
|
||||
if(t.kind==='struct'&&t.fields)return structKids(t,0);
|
||||
if(t.kind==='slice')return typeKids(t.elem);
|
||||
return '';
|
||||
|
||||
Reference in New Issue
Block a user