测一测列表整理:热度榜和四个分组统一为一种列表行(缩略图 + 标题说明 + 右侧大号「N万 人测过」),去掉推荐大卡/卷宗/问句卡/关卡路线;热度榜默认前 5;v26110229

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-02 12:54:09 +00:00
parent f1917733d1
commit 245838ef6a
6 changed files with 44 additions and 126 deletions

View File

@@ -325,8 +325,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
</div>
<div class="toast" id="toast"></div>
<script src="meta.js?v=26110228"></script>
<script src="tests.js?v=26110228"></script>
<script src="meta.js?v=26110229"></script>
<script src="tests.js?v=26110229"></script>
<script>
(function () {
'use strict';

View File

@@ -143,83 +143,27 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
.csg-h b{position:relative;font-size:17px;font-weight:900;color:#2A1E1E}
.csg-h b::after{content:"";position:absolute;left:-2px;right:-2px;bottom:1px;height:7px;border-radius:4px;background:var(--tg);opacity:.22;z-index:-1}
.csg-h b{z-index:0}
.pc{display:inline-flex;align-items:center;margin-top:3px;font-size:11px;font-style:normal;font-weight:700;color:#C98A7A}
.csf .pc{display:flex;margin:6px 0 0}
.pc::before{content:"";width:6px;height:6px;margin-right:4px;border-radius:50%;background:#FF8A6B;box-shadow:0 0 0 2px rgba(255,138,107,.2)}
.csg-h small{font-size:12px;color:#A08B85}
.csg-h em{margin-left:auto;font-style:normal;font-size:12px;font-weight:800;color:var(--tg)}
.csf{position:relative;display:flex;align-items:center;gap:12px;width:100%;margin-top:10px;padding:14px 12px 14px 16px;border-radius:22px;overflow:hidden;text-align:left;background:linear-gradient(125deg,var(--tl),#fff 85%);box-shadow:0 8px 20px -14px var(--tg)}
.csf:active,.csr:active{transform:scale(.985)}
.csf .tx{flex:1;min-width:0;position:relative;z-index:1}
.csf .tx small{display:inline-block;height:20px;padding:0 8px;border-radius:99px;background:#fff;color:var(--tg);font-size:11px;font-weight:800;line-height:20px}
.csf .tx b{display:block;margin-top:7px;font-size:17px;font-weight:900;line-height:1.38;color:#2A1E1E}
.csf .tx p{margin-top:3px;font-size:12.5px;color:#7A6A66;line-height:1.5}
.csf .tx .go{display:inline-flex;align-items:center;gap:2px;margin-top:10px;height:30px;padding:0 14px;border-radius:99px;background:var(--tg);color:#fff;font-size:13px;font-weight:800;box-shadow:0 5px 12px -5px var(--tg)}
.csf .tx .go .ic{width:13px;height:13px;stroke-width:2.4}
.csf img{flex:none;width:118px;height:118px;border-radius:28px 28px 28px 8px;object-fit:cover;object-position:center 30%;border:3px solid #fff;box-shadow:0 8px 18px -10px var(--tg)}
.csk .ckl{margin-top:8px;border-radius:20px;background:#fff;box-shadow:0 3px 12px rgba(170,110,90,.07);overflow:hidden}
.ckr{display:flex;align-items:center;gap:12px;width:100%;padding:11px 12px;text-align:left;border-top:1px solid #F7EDE9}
.ckr:first-child{border-top:0}
.ckr .rk{flex:none;width:26px;text-align:center;font-size:17px;font-weight:900;font-style:italic;color:#C9B3AC;font-family:Georgia,serif}
.ckr .rk.r1,.ckr .rk.r2,.ckr .rk.r3{width:26px;height:26px;border-radius:8px;font-style:normal;font-size:14px;line-height:26px;color:#fff}
.ckr .rk.r1{background:linear-gradient(135deg,#FF8A4C,#F0453A)}.ckr .rk.r2{background:linear-gradient(135deg,#FFB547,#F28A1E)}.ckr .rk.r3{background:linear-gradient(135deg,#FFD166,#F2B21E)}
.ckr .tx{flex:1;min-width:0}
.ckr b{display:block;font-size:14px;font-weight:800;line-height:1.4;color:#2A1E1E;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.ckr .hb{display:block;height:4px;margin:5px 0 4px;border-radius:4px;background:#F6EEEA;overflow:hidden}
.ckr .hb i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#FFB08C,#F0603E)}
.ckr small{display:block;font-size:11.5px;color:#A08B85}
.ckr small em{font-style:normal;font-weight:800;color:var(--tg);margin-right:6px}
.ckr .go{flex:none;height:26px;padding:0 11px;border-radius:99px;background:var(--tl);color:var(--tg);font-size:12px;font-weight:800;line-height:26px}
.ckm{display:block;width:100%;margin-top:8px;height:36px;border-radius:12px;background:rgba(255,255,255,.7);color:#8A7470;font-size:12.5px;font-weight:800}
.csq{margin-top:8px;border-radius:20px;background:#fff;box-shadow:0 3px 12px rgba(170,110,90,.07);overflow:hidden}
.csn{display:flex;align-items:center;gap:12px;width:100%;padding:12px 12px 12px 14px;text-align:left;border-top:1px dashed #F1E2DC}
.csn:first-child{border-top:0}
.csn .no{flex:none;width:40px;font-size:20px;font-weight:900;color:var(--tg);line-height:1;font-family:Georgia,serif;font-style:italic}
.csn .no small{display:block;font-size:9px;font-style:normal;letter-spacing:1px;opacity:.6;margin-bottom:2px;font-family:inherit}
.csn .tx{flex:1;min-width:0}
.csn b{display:block;font-size:14.5px;font-weight:800;line-height:1.4;color:#2A1E1E;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.csn small{display:block;font-size:12px;color:#A08B85;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.csn small em{font-style:normal;color:var(--tg);font-weight:700}
.csn .ar{flex:none;color:#D9C3BC}.csn .ar .ic{width:15px;height:15px;stroke-width:2.4}
.csp{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}
.cst{--a:#7C5CFC;--b:#F1EDFF;position:relative;display:flex;flex-direction:column;min-height:128px;padding:14px 14px 12px;border-radius:20px;overflow:hidden;text-align:left;background:var(--b)}
.cst.k1{--a:#E96F8F;--b:#FFEAF0}.cst.k2{--a:#2C9C86;--b:#E2F5EF}.cst.k3{--a:#D98A1E;--b:#FFF2DC}.cst.k4{--a:#4F7EE0;--b:#E6EEFF}
.cst.wide{grid-column:1/-1;min-height:0}
.cst.big{grid-column:1/-1;min-height:0;padding:18px 18px 14px;background:linear-gradient(120deg,#8E6BFF,#C07BF0);color:#fff}
.cst .qm{position:absolute;right:-6px;top:-22px;font-style:normal;font-size:118px;font-weight:900;line-height:1;color:var(--a);opacity:.13;font-family:Georgia,serif}
.cst.big .qm{color:#fff;opacity:.2;font-size:150px;right:6px}
.cst b{position:relative;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;font-size:15px;font-weight:900;line-height:1.42;color:#2A1E1E}
.cst.big b{font-size:19px;color:#fff;padding-right:60px}
.cst small{position:relative;display:block;margin-top:5px;font-size:12px;line-height:1.45;color:#8A7A76}
.cst.big small{color:rgba(255,255,255,.85)}
.cst .ft{position:relative;display:flex;align-items:center;justify-content:space-between;margin-top:auto;padding-top:10px;font-size:12px;font-weight:800;color:var(--a)}
.cst.big .ft{color:#fff}
.cst .ft em{font-style:normal;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.cst .ar{flex:none;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--a)}
.cst.big .ar{color:#8E6BFF}
.cst .ar .ic{width:13px;height:13px;stroke-width:2.6}
.csm{position:relative;margin-top:10px;padding:4px 0;list-style:none}
.csm::before{content:"";position:absolute;left:27px;top:24px;bottom:24px;border-left:3px dashed var(--tg);opacity:.35}
.csm li+li{margin-top:10px}
.csx{position:relative;display:flex;align-items:center;gap:12px;width:100%;text-align:left}
.csx .nd{position:relative;z-index:1;flex:none;width:56px;height:56px;border-radius:50%;display:flex;align-items:baseline;justify-content:center;padding-top:9px;background:#fff;border:3px solid var(--tg);color:var(--tg);font-size:24px;font-weight:900;line-height:1.2;font-family:Georgia,serif}
.csx .nd small{font-size:10px;font-weight:800;font-family:inherit}
.csx.ok .nd{background:var(--tg);color:#fff}
.csx .tx{flex:1;min-width:0;padding:12px 12px 12px 14px;border-radius:16px;background:#fff;box-shadow:0 3px 12px rgba(170,110,90,.07)}
.csx b{display:block;font-size:14.5px;font-weight:800;line-height:1.4;color:#2A1E1E}
.csx .tx small{display:block;margin-top:1px;font-size:12px;color:#A08B85;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.csx.ok .tx small{color:var(--tg);font-weight:700}
.csx .go{position:absolute;right:12px;top:-8px;height:20px;padding:0 9px;border-radius:99px;background:var(--tg);color:#fff;font-size:11px;font-weight:800;line-height:20px;box-shadow:0 4px 10px -4px var(--tg)}
.csn:active,.cst:active,.csx:active{transform:scale(.985)}
.csr{display:flex;align-items:center;gap:12px;width:100%;margin-top:8px;padding:9px 10px 9px 9px;border-radius:18px;background:#fff;text-align:left;box-shadow:0 3px 12px rgba(170,110,90,.07)}
.csr img{flex:none;width:58px;height:58px;border-radius:15px;object-fit:cover;object-position:center 28%;background:var(--tl)}
.csr .tx{flex:1;min-width:0}
.csr b{display:block;font-size:14.5px;font-weight:800;line-height:1.4;color:#2A1E1E;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.g-shop .csr b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;white-space:normal}
.csr small{display:block;margin-top:1px;font-size:12px;color:#A08B85;line-height:1.45;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.csr small em{font-style:normal;color:var(--tg);font-weight:700}
.csr .ar{flex:none;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:var(--tl);color:var(--tg)}
.csr .ar .ic{width:15px;height:15px;stroke-width:2.4}
/* 11-02 v4 用户:「测一测页面太乱,整洁一些,多少人测过要明显」→ 所有分组统一一种列表行:缩略图 + 标题/说明 + 右侧大号人数 */
.cpl{margin-top:8px;border-radius:20px;background:#fff;box-shadow:0 3px 12px rgba(170,110,90,.07);overflow:hidden}
.cr{display:flex;align-items:center;gap:12px;width:100%;padding:12px;text-align:left;border-top:1px solid #F7EFEB}
.cr:first-child{border-top:0}
.cr:active{background:#FCF8F6}
.cr .cth{position:relative;flex:none;width:58px;height:58px}
.cr .cth img{display:block;width:100%;height:100%;border-radius:14px;object-fit:cover;object-position:center 28%;background:var(--tl)}
.cr .crk{position:absolute;left:-5px;top:-5px;min-width:20px;height:20px;padding:0 5px;border-radius:7px;background:#B9A7A1;color:#fff;font-size:11.5px;font-weight:900;line-height:20px;text-align:center;border:2px solid #fff;font-style:normal}
.cr .crk.r1{background:#F0453A}.cr .crk.r2{background:#F28A1E}.cr .crk.r3{background:#F2B21E}
.cr .tx{flex:1;min-width:0}
.cr b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:14.5px;font-weight:800;line-height:1.4;color:#2A1E1E}
.cr small{display:block;margin-top:3px;font-size:12px;color:#A99590;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.cr small em{font-style:normal;font-weight:800;color:var(--tg)}
.cr .cn{flex:none;min-width:58px;text-align:right}
.cr .cn b{display:block;font-size:18px;font-weight:900;line-height:1.1;color:#F0603E;font-family:-apple-system,"DIN Alternate","Helvetica Neue",sans-serif;letter-spacing:-.3px}
.cr .cn b i{font-size:12px;font-style:normal;font-weight:800;margin-left:1px}
.cr .cn small{margin-top:2px;font-size:11px;color:#B8A39D}
.cr .cn.dn b{font-size:13px;color:var(--tg)}
.ckm{display:block;width:100%;height:42px;border-top:1px solid #F7EFEB;color:#8A7470;font-size:12.5px;font-weight:800;background:#fff}
.k-ceshi{--kf:#7C5CFC;--kt:#6346B0;--kl:#F1EDFF;--kl2:#E4DDFD}
.g-quiz{--tg:#F0714F;--tl:#FFEFE9}.g-psy{--tg:#7C5CFC;--tl:#F1EDFF}.g-game{--tg:#13A08A;--tl:#E4F6F1}.g-shop{--tg:#E9557F;--tl:#FFEEF3}
.nc.tst .cvw{background:var(--tl)}
@@ -606,10 +550,10 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
<div class="toast" id="toast"></div>
<script src="topics.js?v=26110228"></script>
<script src="data.js?v=26110228"></script>
<script src="feed.js?v=26110228"></script>
<script src="ceshi/meta.js?v=26110228"></script>
<script src="topics.js?v=26110229"></script>
<script src="data.js?v=26110229"></script>
<script src="feed.js?v=26110229"></script>
<script src="ceshi/meta.js?v=26110229"></script>
<script>
(function () {
'use strict';
@@ -818,53 +762,27 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
/* 热度排序:按「N人测过」(ceshi/meta.js gcTested,模拟数,见 AGENTS.md 12b)从高到低 */
var byHot = function (l) { return l.slice().sort(function (a, b) { return gcTested(b.id) - gcTested(a.id); }); }, hotOpen = false;
var TGD = { quiz: '有标准答案,答完看解析', psy: '没有对错,测测你是哪一型', game: '挑战一下,看能拿什么称号', shop: '看看你是哪一类育儿采购玩家' };
/* 每组换一种排法,避免整页一个样:考卷=编号卷宗,心理=双列卡,闯关=横滑大卡,好物=图文行 */
function rest(g, l, done) {
if (g === 'psy') return '<div class="csp">' + l.map(function (x, i) {
var d = done[x.id];
return '<button type="button" class="cst k' + (i % 5) + (i === 0 ? ' big' : i === l.length - 1 && l.length % 2 === 0 ? ' wide' : '') + '" data-test="' + x.id + '"><i class="qm">?</i>' +
'<b>' + esc(x.title) + '</b><small>' + esc(x.sub) + '</small>' +
'<span class="ft">' + (d ? '<em>我是 · ' + esc(d.title) + '</em>' : gcTestedText(x.id)) + '<span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></span></button>';
}).join('') + '</div>';
if (g === 'game') return '<ol class="csm">' + l.map(function (x, i) {
var d = done[x.id];
return '<li><button type="button" class="csx' + (d ? ' ok' : '') + '" data-test="' + x.id + '"><span class="nd"><small>第</small>' + (i + 1) + '<small>站</small></span>' +
'<span class="tx"><b>' + esc(x.title) + '</b><small>' + (d ? '已拿称号「' + esc(d.title) + '」' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span>' +
'<span class="go">' + (d ? '再闯' : '开闯') + '</span></button></li>';
}).join('') + '</ol>';
if (g === 'quiz') return '<div class="csq">' + l.map(function (x, i) {
var d = done[x.id];
return '<button type="button" class="csn" data-test="' + x.id + '"><span class="no"><small>TOP</small>' + ('0' + (byHot(TM.filter(function (y) { return y.group === 'quiz'; })).indexOf(x) + 1)).slice(-2) + '</span><span class="tx"><b>' + esc(x.title) + '</b>' +
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
}).join('') + '</div>';
return l.map(function (x) {
var d = done[x.id];
return '<button type="button" class="csr" data-test="' + x.id + '"><img src="ceshi/img/' + x.id + '_s.webp" alt="" loading="lazy"><span class="tx"><b>' + esc(x.title) + '</b>' +
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
}).join('');
/* 统一列表行:缩略图(热度榜带名次)+ 标题 / 说明 + 右侧大号人数;测过的右侧换成「已测」 */
function rowHTML(x, done, rank) {
var d = done[x.id], num = gcTestedText(x.id).replace('人测过', '').replace('万', '<i>万</i>');
return '<button type="button" class="cr g-' + x.group + '" data-test="' + x.id + '"><span class="cth"><img src="ceshi/img/' + x.id + '_s.webp" alt="" loading="lazy">' +
(rank ? '<i class="crk' + (rank <= 3 ? ' r' + rank : '') + '">' + rank + '</i>' : '') + '</span>' +
'<span class="tx"><b>' + esc(x.title) + '</b><small>' + (d ? '<em>' + (x.group === 'quiz' || x.group === 'game' ? '已拿「' : '我是「') + esc(d.title) + '」</em>' : (rank ? '<em>' + TG[x.group] + '</em> · ' : '') + esc(x.sub)) + '</small></span>' +
'<span class="cn"><b>' + num + '</b><small>人测过</small></span></button>';
}
function hotHTML(done) {
var l = byHot(TM), top = gcTested(l[0].id);
return '<section class="csg csk"><div class="csg-h"><b>热度榜</b><small>按测过的人数排名</small></div><div class="ckl">' +
l.slice(0, hotOpen ? l.length : 10).map(function (x, i) {
var d = done[x.id];
return '<button type="button" class="ckr g-' + x.group + '" data-test="' + x.id + '"><span class="rk r' + (i < 3 ? i + 1 : 0) + '">' + (i + 1) + '</span>' +
'<span class="tx"><b>' + esc(x.title) + '</b><span class="hb"><i style="width:' + Math.max(18, Math.round(gcTested(x.id) / top * 100)) + '%"></i></span>' +
'<small><em>' + TG[x.group] + '</em>' + gcTestedText(x.id) + (d ? ' · 已测' : '') + '</small></span>' +
'<span class="go">' + (d ? '再测' : '去测') + '</span></button>';
}).join('') + '</div><button type="button" class="ckm" data-hot="1">' + (hotOpen ? '收起' : '查看完整榜单(' + l.length + ' 个)') + '</button></section>';
var l = byHot(TM);
return '<section class="csg csk"><div class="csg-h"><b>热度榜</b><small>按测过的人数排名</small></div><div class="cpl">' +
l.slice(0, hotOpen ? l.length : 5).map(function (x, i) { return rowHTML(x, done, i + 1); }).join('') +
'<button type="button" class="ckm" data-hot="1">' + (hotOpen ? '收起' : '查看完整榜单(' + l.length + ' 个)') + '</button></div></section>';
}
function ceshiListHTML() {
var done = csDone();
return '<div class="csl">' + (tGrp ? '' : hotHTML(done)) + ['quiz', 'psy', 'game', 'shop'].filter(function (g) { return !tGrp || tGrp === g; }).map(function (g) {
var l = byHot(TM.filter(function (x) { return x.group === g; })); if (!l.length) return '';
var nd = l.filter(function (x) { return done[x.id]; }).length;
var f = l.filter(function (x) { return !done[x.id]; })[0] || l[0]; /* 推荐位:本组第一个没测过的 */
if (g === 'psy' || g === 'game') return '<section class="csg g-' + g + '"><div class="csg-h"><b>' + TG[g] + '</b><small>' + l.length + ' 套 · ' + TGD[g] + '</small>' + (nd ? '<em>已测 ' + nd + '</em>' : '') + '</div>' + rest(g, l, done) + '</section>';
return '<section class="csg g-' + g + '"><div class="csg-h"><b>' + TG[g] + '</b><small>' + l.length + ' 套 · ' + TGD[g] + '</small>' + (nd ? '<em>已测 ' + nd + '</em>' : '') + '</div>' +
'<button type="button" class="csf" data-test="' + f.id + '"><span class="tx"><small>' + (done[f.id] ? '再测一次' : f === l[0] ? '本组最热' : '本组推荐') + '</small><b>' + esc(f.title) + '</b><p>' + esc(f.sub) + '</p><i class="pc">' + gcTestedText(f.id) + '</i>' +
'<span class="go">' + (done[f.id] ? '再测' : '开始测') + '<svg class="ic"><use href="#i-right"/></svg></span></span><img src="ceshi/img/' + f.id + '_s.webp" alt="" loading="lazy"></button>' +
rest(g, l.filter(function (x) { return x !== f; }), done) + '</section>';
'<div class="cpl">' + l.map(function (x) { return rowHTML(x, done); }).join('') + '</div></section>';
}).join('') + '</div>';
}
function ceshiHead() {

View File

@@ -105,7 +105,7 @@ main{padding:6px 16px 0}
</div>
<div class="wb"><button type="button" id="write"><svg class="ic" viewBox="0 0 24 24"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>写新的故事</button></div>
<script src="../topics.js?v=26110228"></script>
<script src="../topics.js?v=26110229"></script>
<script>
(function () {
'use strict';