@@ -242,6 +242,75 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
. ck . ct { display : -webkit- box ; -webkit- line-clamp : 2 ; -webkit- box-orient : vertical ; overflow : hidden ; margin : 8 px 8 px 0 ; min-height : 2.8 em ; font-size : 12.5 px ; font-weight : 700 ; line-height : 1.4 ; color : #3A3040 }
. c2 . ck . ct { font-size : 13.5 px }
. ck . cnn { display : inline-flex ; align-items : center ; justify-content : center ; gap : 2 px ; margin : 4 px 0 9 px ; font-size : 11 px ; font-weight : 800 ; color : #F0704F }
/* 11-04 用户:「背景太单一、行图标都一样、加头像、整体 UI 太单一」→ 每组一块分组色底板(带淡图案 + 大号分组水印),行图标按测试各不相同、底色三档深浅,卡片 / 行 / 组标题都挂头像堆 */
. csg { position : relative ; margin : 22 px -4 px 0 ; padding : 16 px 10 px 14 px ; border-radius : 22 px ; background : var ( - - gb ) ; overflow : hidden }
. csg :: before { content : "" ; position : absolute ; inset : 0 ; background-image : radial-gradient ( var ( - - gd ) 1.2 px , transparent 1.4 px ) ; background-size : 16 px 16 px ; opacity : .55 ; pointer-events : none }
. csg > * { position : relative }
. csg . g-quiz { --gb : linear-gradient ( 170 deg , #FFEDE2 , #FFF6F0 40 % , #FFF1E8 ) ; --gd : #FFD2BC }
. csg . g-psy { --gb : linear-gradient ( 170 deg , #EFE8FF , #F8F5FF 40 % , #F1EBFF ) ; --gd : #DCCFF7 }
. csg . g-game { --gb : linear-gradient ( 170 deg , #E2F6EA , #F3FBF6 40 % , #E6F7EE ) ; --gd : #BFE7D0 }
. csg . g-shop { --gb : linear-gradient ( 170 deg , #E3EEFF , #F4F8FF 40 % , #E8F1FF ) ; --gd : #C7DBFA }
. csg > . csg-deco { position : absolute ; right : -14 px ; top : -18 px ; width : 96 px ; height : 96 px ; border-radius : 30 px ; background : var ( - - gi ) ; opacity : .13 ; transform : rotate ( 14 deg ) ; display : grid ; place-items : center }
. csg > . csg-deco svg { width : 64 px ; height : 64 px }
. csg-h b { flex-wrap : wrap }
. csg-n { display : inline-flex ; align-items : center ; gap : 4 px ; margin-left : auto ; height : 24 px ; padding : 0 9 px 0 4 px ; border-radius : 99 px ; background : rgba ( 255 , 255 , 255 , .75 ) ; font-size : 11 px ; font-weight : 800 ; color : var ( - - gi ) }
. csg-n . cav img { width : 18 px ; height : 18 px }
. cav { display : inline-flex ; align-items : center ; vertical-align : middle }
. cav img { width : 16 px ; height : 16 px ; border-radius : 50 % ; object-fit : cover ; border : 1.5 px solid #fff ; background : #FFE3D3 ; margin-left : -5 px }
. cav img : first-child { margin-left : 0 }
. ck . cnn . cav { margin-right : 5 px }
. csr-m small . cav { margin-left : 8 px } . csr-m small . cav + i { margin-left : 4 px }
. csr-i . s1 { background : linear-gradient ( 135 deg , var ( - - cb ) , var ( - - c4 ) ) }
. csr-i . s2 { background : var ( - - c1 ) ; box-shadow : inset 0 0 0 1.5 px var ( - - c3 ) }
. csr-i . s2 svg { fill : var ( - - cb ) } . csr-i . s2 svg [ fill = "#fff" ] { fill : var ( - - cb ) } . csr-i . s2 svg [ stroke = "#fff" ] { stroke : var ( - - cb ) }
. csr-i svg { width : 22 px ; height : 22 px }
. csr-i { border-radius : 13 px ; transform : rotate ( -4 deg ) }
. csr : nth-child ( even ) . csr-i { transform : rotate ( 4 deg ) }
. ck . cv . ck-wm { position : absolute ; right : -8 px ; bottom : -6 px ; width : 62 px ; height : 62 px ; opacity : .22 ; transform : rotate ( -12 deg ) ; pointer-events : none }
. ck . cv . ck-wm svg { width : 100 % ; height : 100 % }
. ck . cv . ck-wm svg , . ck . cv . ck-wm svg [ fill = "#fff" ] { fill : var ( - - cb ) } . ck . cv . ck-wm svg [ stroke = "#fff" ] { stroke : var ( - - cb ) }
. csv-n { flex-wrap : nowrap }
. csv-av { margin-left : auto }
. csv-av . cav img { width : 22 px ; height : 22 px ; margin-left : -7 px ; transition : transform .22 s , opacity .22 s }
. csv-av . cav img : first-child { margin-left : 0 }
. csv-av . cav img . sw { transform : scale ( .3 ) ; opacity : 0 }
. csv-r { height : 90 px !important }
. csv-i { opacity : 0 ; transform : translateY ( 90 px ) ; transition : transform .5 s cubic-bezier ( .3 , 1.2 , .5 , 1 ) , opacity .45 s ease !important ; height : 30 px }
. csv-i img { width : 22 px !important ; height : 22 px !important }
. csv-i : nth-child ( odd ) b { color : #F0704F }
/* 摇一摇全屏浮层 */
. lko { position : fixed ; inset : 0 ; z-index : 9999 ; display : grid ; place-items : center ; pointer-events : auto }
. lko-bg { position : absolute ; inset : 0 ; background : radial-gradient ( circle at 50 % 42 % , rgba ( 141 , 107 , 255 , .55 ) , rgba ( 40 , 20 , 80 , .78 ) ) ; opacity : 0 ; transition : opacity .25 s ; -webkit- backdrop-filter : blur ( 4 px ) ; backdrop-filter : blur ( 4 px ) }
. lko . on . lko-bg { opacity : 1 }
. lko-in { position : relative ; display : flex ; flex-direction : column ; align-items : center ; gap : 14 px ; width : 300 px ; transform : scale ( .6 ) ; opacity : 0 ; transition : transform .35 s cubic-bezier ( .3 , 1.5 , .5 , 1 ) , opacity .25 s }
. lko . on . lko-in { transform : none ; opacity : 1 }
. lko-dc { position : relative ; width : 170 px ; height : 110 px }
. lko-dc span { position : absolute ; width : 84 px ; height : 84 px ; filter : drop-shadow ( 0 10 px 14 px rgba ( 20 , 0 , 60 , .45 ) ) ; animation : lkoT .42 s linear infinite }
. lko-dc span svg { width : 100 % ; height : 100 % ; display : block }
. lko-dc . a { left : 6 px ; top : 14 px } . lko-dc . b { right : 6 px ; top : 0 ; width : 66 px ; height : 66 px ; animation-duration : .34 s ; animation-direction : reverse }
@ keyframes lkoT { 0 % { transform : rotate ( 0 ) translateY ( 0 ) } 25 % { transform : rotate ( 90 deg ) translateY ( -16 px ) } 50 % { transform : rotate ( 180 deg ) } 75 % { transform : rotate ( 270 deg ) translateY ( -10 px ) } 100 % { transform : rotate ( 360 deg ) } }
. lko . hit . lko-dc span { animation : lkoLand .5 s cubic-bezier ( .3 , 1.7 , .5 , 1 ) }
@ keyframes lkoLand { from { transform : scale ( 1.35 ) rotate ( -25 deg ) } to { transform : none } }
. lko-tip { margin : 0 ; color : #fff ; font-size : 15 px ; font-weight : 800 ; letter-spacing : 2 px ; opacity : .9 }
. lko . hit . lko-tip { font-size : 24 px ; letter-spacing : 3 px ; color : #FFE27A ; opacity : 1 ; animation : lkoLand .5 s cubic-bezier ( .3 , 1.7 , .5 , 1 ) }
. lko-reel { width : 100 % ; height : 58 px ; border-radius : 18 px ; background : rgba ( 255 , 255 , 255 , .16 ) ; box-shadow : inset 0 0 0 2 px rgba ( 255 , 255 , 255 , .35 ) ; overflow : hidden ; display : grid ; place-items : center }
. lko-reel span { display : block ; color : #fff ; font-size : 24 px ; font-weight : 900 ; letter-spacing : 1 px ; white-space : nowrap }
. lko-reel span . sp { animation : lkoSp .1 s linear }
@ keyframes lkoSp { from { transform : translateY ( -90 % ) ; opacity : .2 ; filter : blur ( 2 px ) } }
. lko . hit . lko-reel { display : none }
. lko-card { width : 100 % }
. lko-card . ck { transform : scale ( .5 ) rotate ( -8 deg ) ; opacity : 0 ; animation : lkoCard .55 s .05 s cubic-bezier ( .3 , 1.5 , .5 , 1 ) forwards ; box-shadow : 0 18 px 40 px -10 px rgba ( 20 , 0 , 60 , .6 ) }
@ keyframes lkoCard { to { transform : none ; opacity : 1 } }
. lko-card . ck . cv { height : auto ; padding : 26 px 16 px 20 px ; gap : 8 px }
. lko-card . ck . cv b { font-size : 20 px ; -webkit- line-clamp : 3 }
. lko-card . ck . cv small { font-size : 12.5 px }
. lko-card . ck . cv em { height : 32 px ; line-height : 32 px ; padding : 0 20 px ; font-size : 14 px }
. lko-card . lko-ic { display : grid ; place-items : center ; width : 52 px ; height : 52 px ; border-radius : 16 px ; background : var ( - - cb ) ; box-shadow : 0 6 px 14 px -6 px var ( - - cb ) ; position : relative }
. lko-card . lko-ic svg { width : 30 px ; height : 30 px }
. lko-fx { position : absolute ; left : 50 % ; top : 50 % ; pointer-events : none }
. lko-fx i { position : absolute ; width : 9 px ; height : 12 px ; border-radius : 2 px ; animation : lkoBoom 1.3 s cubic-bezier ( .2 , .7 , .4 , 1 ) forwards }
@ keyframes lkoBoom { from { transform : translate ( 0 , 0 ) rotate ( 0 ) scale ( 1 ) ; opacity : 1 } to { transform : translate ( var ( - - x ) , calc ( var ( - - y ) + 180 px ) ) rotate ( var ( - - r ) ) scale ( .6 ) ; opacity : 0 } }
@ media ( prefers-reduced-motion : reduce ) { . lko-dc span { animation : none } }
. ck . cnn svg { width : 11 px ; height : 11 px }
. csr . pa , . ck . pa { --c1 : #FFF4EA ; --c2 : #FFE4D6 ; --c3 : #FFC9AE ; --c4 : #FFB08F ; --cb : #FF8A65 }
. csr . pb , . ck . pb { --c1 : #F4F0FA ; --c2 : #E9E4F4 ; --c3 : #B9AEDB ; --c4 : #E8D9EE ; --cb : #8D84BE }
@@ -762,10 +831,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=26110293 " > < / script >
< script src = "data.js?v=26110293 " > < / script >
< script src = "feed.js?v=26110293 " > < / script >
< script src = "ceshi/meta.js?v=26110293 " > < / script >
< script src = "topics.js?v=26110294 " > < / script >
< script src = "data.js?v=26110294 " > < / script >
< script src = "feed.js?v=26110294 " > < / script >
< script src = "ceshi/meta.js?v=26110294 " > < / script >
< script >
( function ( ) {
'use strict' ;
@@ -831,7 +900,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
var CMD = null , CMERR = false ;
/* 头像编码:数字 = av/NNNN.webp( 旧代码头像) ; 'av:c012' = av/c012.webp( 卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
var avP = function ( a ) { return typeof a === 'number' ? 'av/' + ( '000' + a ) . slice ( - 4 ) + '.webp' : a . indexOf ( 'av:' ) === 0 ? 'av/' + a . slice ( 3 ) + '.webp' : a . charAt ( 0 ) === '/' ? a : '../assets/img/mom/' + a + '.jpg' ; } ;
fetch ( 'cm.json?v=26110293 ' ) . then ( function ( r ) { return r . json ( ) ; } ) . then ( function ( j ) {
fetch ( 'cm.json?v=26110294 ' ) . then ( function ( r ) { return r . json ( ) ; } ) . then ( function ( j ) {
CMD = j ; if ( openId && NBY [ openId ] ) { renderComments ( NBY [ openId ] ) ; syncBar ( NBY [ openId ] ) ; }
} ) . catch ( function ( ) { CMERR = true ; if ( openId && NBY [ openId ] ) renderComments ( NBY [ openId ] ) ; } ) ;
function commentsOf ( n ) {
@@ -1056,11 +1125,51 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
game : '<svg viewBox="0 0 24 24"><path d="M7 4h10v5a5 5 0 01-10 0zM7 6H4v1.5A3.5 3.5 0 007.3 11M17 6h3v1.5a3.5 3.5 0 01-3.3 3.5" fill="#fff"/><path d="M7 6H4v1.5A3.5 3.5 0 007.3 11M17 6h3v1.5a3.5 3.5 0 01-3.3 3.5" fill="none" stroke="#fff" stroke-width="1.6"/><path d="M10.5 14h3v3h-3zM8 17.5h8V20H8z" fill="#fff"/></svg>' ,
shop : '<svg viewBox="0 0 24 24"><path d="M5 8.5h14l-1 11.5H6z" fill="#fff"/><path d="M9 10V7a3 3 0 016 0v3" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/></svg>'
} ;
/* 11-04 用户:「一行一条前面的图标都是一样的小书」→ 每个测试一枚自己的扁平图标(白色实心,底色按分组再分深浅三档),宫格卡封面右下角也放一枚大号淡水印 */
var CS _TI = {
t01 : '<path d="M12 6.2c-1.6-2.3-6.6-2.2-7.4 2.2-.8 4.5 2.6 10.6 5.2 11 1 .2 1.4-.4 2.2-.4s1.2.6 2.2.4c2.6-.4 6-6.5 5.2-11-.8-4.4-5.8-4.5-7.4-2.2z"/><path d="M12 6c0-1.6.8-2.8 2.4-3.4" fill="none" stroke="#fff" stroke-width="1.7" stroke-linecap="round"/>' ,
t02 : '<circle cx="12" cy="6.5" r="3.6"/><path d="M4.5 21c0-4.6 3.4-7.6 7.5-7.6s7.5 3 7.5 7.6z"/><path d="M12 13.6l-1.4 2.2L12 21l1.4-5.2z" fill="rgba(0,0,0,.18)"/>' ,
t03 : '<circle cx="12" cy="12.5" r="7.6"/><circle cx="9.3" cy="12" r="1.1" fill="rgba(0,0,0,.28)"/><circle cx="14.7" cy="12" r="1.1" fill="rgba(0,0,0,.28)"/><path d="M10 15.2c1.2 1 2.8 1 4 0" fill="none" stroke="rgba(0,0,0,.28)" stroke-width="1.3" stroke-linecap="round"/><path d="M12 4.9c-.4-1.4.6-2.5 2-2.2" fill="none" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/>' ,
t04 : '<path d="M8 3h8l-1 3.5H9z"/><rect x="7.5" y="7.5" width="9" height="13.5" rx="3.2"/><path d="M9.5 12h5M9.5 15.5h5" stroke="rgba(0,0,0,.2)" stroke-width="1.3"/>' ,
t05 : '<rect x="3.5" y="7" width="17" height="13" rx="3"/><path d="M9 7V5.2C9 4.5 9.5 4 10.2 4h3.6c.7 0 1.2.5 1.2 1.2V7" fill="none" stroke="#fff" stroke-width="1.8"/><path d="M3.5 12.5h17" stroke="rgba(0,0,0,.18)" stroke-width="1.4"/><rect x="10.5" y="11.2" width="3" height="2.6" rx=".8" fill="rgba(0,0,0,.2)"/>' ,
t06 : '<ellipse cx="12" cy="15.5" rx="8.5" ry="4.5"/><circle cx="16.8" cy="9.2" r="3.4"/><path d="M19.8 9.4l2 .6-2 .8z"/><circle cx="17.5" cy="8.6" r=".7" fill="rgba(0,0,0,.35)"/>' ,
t07 : '<path d="M3 11h18c0 4.7-3.6 8.5-9 8.5S3 15.7 3 11z"/><path d="M8.5 8.5c-.8-1 .6-2-.2-3.2M12 8.5c-.8-1 .6-2-.2-3.2M15.5 8.5c-.8-1 .6-2-.2-3.2" fill="none" stroke="#fff" stroke-width="1.5" stroke-linecap="round"/>' ,
t08 : '<ellipse cx="9" cy="7.8" rx="4" ry="5"/><path d="M8.2 12.5h1.6l.7 8.2a1.5 1.5 0 01-3 0z"/><path d="M16 3v6.5M14 3v4.8a2 2 0 004 0V3M16 9.5V21" fill="none" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/>' ,
t09 : '<path d="M14.5 3.2A8.8 8.8 0 1020.8 15 7 7 0 0114.5 3.2z"/><path d="M17 5.5h3l-3 3.2h3" fill="none" stroke="#fff" stroke-width="1.4" stroke-linejoin="round"/>' ,
t10 : '<path d="M12 2.8s-6.5 7.2-6.5 11.6a6.5 6.5 0 0013 0C18.5 10 12 2.8 12 2.8z"/><path d="M9 14.5a3 3 0 002.6 3" fill="none" stroke="rgba(0,0,0,.2)" stroke-width="1.5" stroke-linecap="round"/>' ,
t11 : '<rect x="3.5" y="5" width="17" height="15.5" rx="3"/><path d="M3.5 9.5h17" stroke="rgba(0,0,0,.2)" stroke-width="1.4"/><path d="M8 3v4M16 3v4" stroke="#fff" stroke-width="2" stroke-linecap="round"/><path d="M8 14.6l2.4 2.2 4.6-4.4" fill="none" stroke="rgba(0,0,0,.28)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>' ,
t12 : '<path d="M12 2.8l2.8 5.8 6.3.9-4.6 4.4 1.1 6.3L12 17.2l-5.6 3 1.1-6.3L2.9 9.5l6.3-.9z"/>' ,
t13 : '<path d="M12 21v-8.5" stroke="#fff" stroke-width="2" stroke-linecap="round"/><path d="M12 13C12 8 8.5 5.5 4 6c0 4.5 3.2 7.2 8 7zM12 11.5c0-4 3-6.8 7.5-6.5 0 4.2-3 6.8-7.5 6.5z"/>' ,
t14 : '<circle cx="9" cy="9" r="4"/><path d="M9 2v1.4M3.4 9H2M4.1 4.1l1 1M13.9 4.1l-1 1" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/><path d="M7.5 20.5a4.5 4.5 0 01.6-9 6 6 0 0111.4 2.2 3.4 3.4 0 01-.5 6.8z"/>' ,
t15 : '<path d="M4 5.5c2.6-.9 5.4-.5 7.3 1v13c-1.9-1.4-4.7-1.8-7.3-.9zM20 5.5c-2.6-.9-5.4-.5-7.3 1v13c1.9-1.4 4.7-1.8 7.3-.9z"/><path d="M15 9.2l1.2.8 1.6-2" fill="none" stroke="rgba(0,0,0,.25)" stroke-width="1.3" stroke-linecap="round"/>' ,
t16 : '<circle cx="8" cy="7" r="3"/><circle cx="16" cy="7" r="3"/><path d="M2.5 19c0-3.6 2.4-6 5.5-6s5.5 2.4 5.5 6zM10.5 19c0-3.6 2.4-6 5.5-6s5.5 2.4 5.5 6z"/><path d="M12 16.6s-2-1.2-2-2.6c0-.8.6-1.3 1.2-1.3.4 0 .7.2.8.5.1-.3.4-.5.8-.5.6 0 1.2.5 1.2 1.3 0 1.4-2 2.6-2 2.6z" fill="#FFD3DE"/>' ,
t17 : '<path d="M7 19.5a4.5 4.5 0 01-.7-9 6.2 6.2 0 0111.8 1.3A3.9 3.9 0 0117.5 19.5z"/><path d="M8 22l1-2M12 22l1-2M16 22l1-2" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/>' ,
t18 : '<path d="M12 3.5v16.5M6.5 20h11" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/><path d="M4 7.5h16" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/><path d="M2.5 13.5L5 7.5l2.5 6zM16.5 13.5L19 7.5l2.5 6z"/><path d="M2.5 13.5a2.5 2 0 005 0zM16.5 13.5a2.5 2 0 005 0z"/>' ,
t19 : '<circle cx="8" cy="8" r="3.2"/><circle cx="16.5" cy="10.5" r="2.5"/><path d="M2.5 20c0-4 2.4-6.6 5.5-6.6s5.5 2.6 5.5 6.6zM12.5 20c.2-3 1.8-5 4-5s3.8 2 4 5z"/>' ,
t20 : '<circle cx="12" cy="8" r="4.2"/><path d="M4.5 21c0-4.5 3.4-7.4 7.5-7.4s7.5 2.9 7.5 7.4z"/><circle cx="10.2" cy="8.3" r="1.3" fill="none" stroke="rgba(0,0,0,.3)" stroke-width=".9"/><circle cx="13.8" cy="8.3" r="1.3" fill="none" stroke="rgba(0,0,0,.3)" stroke-width=".9"/><path d="M8.4 4.6c1.2-1.4 6-1.4 7.2 0" fill="none" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/>' ,
t21 : '<path d="M4 13a8 8 0 0116 0" fill="none" stroke="#fff" stroke-width="2"/><rect x="2.5" y="12.5" width="5" height="7.5" rx="2"/><rect x="16.5" y="12.5" width="5" height="7.5" rx="2"/><path d="M12 9.5v4.2a1.6 1.6 0 11-1-1.5V9.5h3.2" fill="none" stroke="#fff" stroke-width="1.4"/>' ,
t22 : '<path d="M12 2.8a6.5 6.5 0 00-3.8 11.8V17h7.6v-2.4A6.5 6.5 0 0012 2.8z"/><rect x="8.6" y="18.2" width="6.8" height="2.6" rx="1.2"/><path d="M10.4 8.4l3.2 3.2M13.6 8.4l-3.2 3.2" stroke="rgba(0,0,0,.25)" stroke-width="1.5" stroke-linecap="round"/>' ,
t23 : '<circle cx="12" cy="12" r="2.6" fill="rgba(0,0,0,.18)"/><path d="M12 9.4c-1.4-4 1.4-6.4 0-6.4s1.4 2.4 0 6.4z"/><ellipse cx="12" cy="5.8" rx="2.6" ry="3.6"/><ellipse cx="12" cy="18.2" rx="2.6" ry="3.6"/><ellipse cx="5.8" cy="12" rx="3.6" ry="2.6"/><ellipse cx="18.2" cy="12" rx="3.6" ry="2.6"/><circle cx="12" cy="12" r="2.4" fill="#FFE07A"/>' ,
t24 : '<path d="M4 4h6v2.2a2 2 0 103.6 0V4H20v6h-2.2a2 2 0 100 3.6H20V20h-6v-2.2a2 2 0 10-3.6 0V20H4v-6.4h2.2a2 2 0 100-3.6H4z"/>' ,
t25 : '<circle cx="12" cy="12" r="8.6"/><circle cx="9" cy="10" r="1.2" fill="rgba(0,0,0,.3)"/><circle cx="15" cy="10" r="1.2" fill="rgba(0,0,0,.3)"/><path d="M8 13.6c1.8 2.8 6.2 2.8 8 0" fill="none" stroke="rgba(0,0,0,.3)" stroke-width="1.6" stroke-linecap="round"/>' ,
t26 : '<path d="M3 5h2.4l2.3 10.2h10.4L20.5 8H6.6"/><path d="M3 5h2.4l2.3 10.2h10.4L20.5 8H6.6" fill="none" stroke="#fff" stroke-width="1.8" stroke-linejoin="round"/><circle cx="9" cy="19" r="1.7"/><circle cx="16.5" cy="19" r="1.7"/>' ,
t27 : '<rect x="3.5" y="9" width="17" height="11.5" rx="2"/><rect x="2.5" y="6" width="19" height="4" rx="1.5"/><path d="M12 6v14.5" stroke="rgba(0,0,0,.2)" stroke-width="1.6"/><path d="M12 6c-1.5-3.5-5.5-3-4 0M12 6c1.5-3.5 5.5-3 4 0" fill="none" stroke="#fff" stroke-width="1.6"/>' ,
t28 : '<path d="M3 9.5l9-5.5 9 5.5V20H3z"/><rect x="7" y="13" width="4" height="4" rx=".8" fill="rgba(0,0,0,.18)"/><rect x="13" y="13" width="4" height="7" rx=".8" fill="rgba(0,0,0,.18)"/>' ,
t29 : '<rect x="2.5" y="7.5" width="19" height="10" rx="5"/><path d="M7 10.5v4M5 12.5h4" stroke="rgba(0,0,0,.3)" stroke-width="1.5" stroke-linecap="round"/><circle cx="15.5" cy="11.3" r="1.1" fill="rgba(0,0,0,.3)"/><circle cx="17.8" cy="13.6" r="1.1" fill="rgba(0,0,0,.3)"/>' ,
t30 : '<rect x="5" y="3.5" width="14" height="17.5" rx="2.5"/><rect x="9" y="2" width="6" height="3.4" rx="1.2" fill="rgba(0,0,0,.2)"/><path d="M8 9.5l1 1 2-2M8 14.5l1 1 2-2M13 9.8h3.5M13 14.8h3.5" fill="none" stroke="rgba(0,0,0,.28)" stroke-width="1.4" stroke-linecap="round"/>'
} ;
function csTI ( x ) { return CS _TI [ x . id ] ? '<svg viewBox="0 0 24 24" fill="#fff" aria-hidden="true">' + CS _TI [ x . id ] + '</svg>' : CS _ICO [ x . group ] ; }
/* 头像: 59 张人设照轮着取,同一张卡/行 3 个不重复, 相邻两处也不撞( 模拟, AGENTS.md 12b, 12-31 复核) */
var CS _AVP = ( function ( ) { var a = [ ] , i ; for ( i = 1 ; i <= 13 ; i ++ ) a . push ( 'k' + ( i < 10 ? '0' : '' ) + i ) ; for ( i = 1 ; i <= 22 ; i ++ ) a . push ( 'm' + ( i < 10 ? '0' : '' ) + i ) ; for ( i = 1 ; i <= 14 ; i ++ ) a . push ( 'p' + ( i < 10 ? '0' : '' ) + i ) ; for ( i = 1 ; i <= 10 ; i ++ ) a . push ( 's' + ( i < 10 ? '0' : '' ) + i ) ;
for ( i = a . length - 1 ; i > 0 ; i -- ) { var j = Math . floor ( Math . random ( ) * ( i + 1 ) ) , t = a [ i ] ; a [ i ] = a [ j ] ; a [ j ] = t ; } return a ; } ) ( ) ;
var csAvK = 0 ;
function csAvs ( n ) { var h = '<span class="cav">' ; for ( var i = 0 ; i < n ; i ++ ) h += '<img src="../assets/img/mom/' + CS _AVP [ csAvK ++ % CS _AVP . length ] + '.jpg" alt="" loading="lazy">' ; return h + '</span>' ; }
var CS _SEC = { quiz : [ '' , '查漏补缺,温和掌握孕产育儿知识' , 2 ] , psy : [ '' , '看见情绪,也看见关系' , 2 ] , game : [ '' , '挑战一下,看能拿什么称号' , 2 ] , shop : [ '' , '看看你是哪一类育儿采购玩家' , 2 ] } ;
function csRowHTML ( x , done , i ) {
var d = done [ x . id ] , who = ( x . sub || '' ) . split ( '·' ) [ 0 ] . trim ( ) ;
return '<button type="button" class="csr ' + CS _GPAL [ x . group ] + '" data-test="' + x . id + '"><span class="csr-i"> ' + CS _ICO [ x . group ] + '</span>' +
'<span class="csr-m"><b>' + esc ( x . title . replace ( /^测一测|/ , '' ) ) + '</b><small>' + esc ( who ) + ' · ' + x . n + ' 题<i>' + gcTestedText ( x . id ) + '</i></small></span>' +
return '<button type="button" class="csr ' + CS _GPAL [ x . group ] + '" data-test="' + x . id + '"><span class="csr-i s ' + ( i % 3 ) + '">' + csTI ( x ) + '</span>' +
'<span class="csr-m"><b>' + esc ( x . title . replace ( /^测一测|/ , '' ) ) + '</b><small>' + esc ( who ) + ' · ' + x . n + ' 题' + csAvs ( 3 ) + ' <i>' + gcTestedText ( x . id ) + '</i></small></span>' +
'<em>' + ( d ? '再测' : '去测' ) + '</em></button>' ;
}
var CS _PAL = [ 'pa' , 'pb' , 'pc' , 'pd' , 'pe' , 'pf' ] ; /* 6 套封面配色轮流:蜜桃 / 薰衣草 / 奶油蓝 / 浅紫 / 薄荷 / 杏橙 */
@@ -1080,8 +1189,8 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
var top = byHot ( TM ) . slice ( 0 , 3 ) . map ( function ( y ) { return y . id ; } ) . indexOf ( x . id ) ;
return '<button type="button" class="ck ' + CS _GPAL [ x . group ] + '" data-test="' + x . id + '"><span class="cv">' + ( CS _BLOBS [ x . group ] || CS _BLOB ) +
( top >= 0 ? '<i class="ck-top t' + ( top + 1 ) + '">TOP' + ( top + 1 ) + '</i>' : '' ) +
'<b>' + esc ( x . title . replace ( /^测一测|/ , '' ) ) + '</b><small>' + esc ( who ) + ' · ' + x . n + ' 题</small><em>' + ( d ? '再测一次' : '开始测试' ) + '</em>' + ( d ? '<i class="dn">已测</i>' : '' ) + '</span>' +
'<span class="cnn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.6 2.5c.4 3-1.6 4.6-3 6.2C8 10.4 7 12 7 14.3A5 5 0 0012 19.5a5 5 0 005-5.2c0-2-1-3.6-1.9-4.6-.2 1.3-.9 2.2-1.9 2.6.6-3.4-.2-7-.6-9.8z" fill="currentColor"/></svg>' + gcTestedText ( x . id ) + '</span></button>' ;
'<i class="ck-wm">' + csTI ( x ) + '</i>< b>' + esc ( x . title . replace ( /^测一测|/ , '' ) ) + '</b><small>' + esc ( who ) + ' · ' + x . n + ' 题</small><em>' + ( d ? '再测一次' : '开始测试' ) + '</em>' + ( d ? '<i class="dn">已测</i>' : '' ) + '</span>' +
'<span class="cnn">' + csAvs ( 3 ) + ' <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.6 2.5c.4 3-1.6 4.6-3 6.2C8 10.4 7 12 7 14.3A5 5 0 0012 19.5a5 5 0 005-5.2c0-2-1-3.6-1.9-4.6-.2 1.3-.9 2.2-1.9 2.6.6-3.4-.2-7-.6-9.8z" fill="currentColor"/></svg>' + gcTestedText ( x . id ) + '</span></button>' ;
}
/* ---------- 11-04 用户:「测试列表页太安静,要热闹、有创意」 ----------
① banner 下一条「此刻 N 人正在测」(红点呼吸、数字隔 2 秒小跳)+ 战报滚动「谁 刚测出「结果」· 哪个测试」(点了进那个测试);
@@ -1105,50 +1214,72 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
return '<button type="button" class="luck" id="csvGo"><span class="luck-dc" id="csdDc">' + diceSVG ( 5 ) + '</span><span class="luck-dc d2">' + diceSVG ( 3 ) + '</span>' +
'<span class="luck-t"><b>不知道测哪个?摇一下</b><span class="luck-w"><span id="csdW">' + ( left > 0 ? '还有 ' + left + ' 个没测过,交给手气' : '全部测完啦,再摇一个重温' ) + '</span></span></span>' +
'<em class="luck-b">摇一摇</em><i class="luck-fx" id="csdFx"></i></button>' +
'<div class="csv"><div class="csv-n"><i class="csv-dot"></i>此刻 <b id="csvN" class="num">' + csNowBase ( ) . toLocaleString ( ) + '</b> 人正在测</div>' +
'<div class="csv"><div class="csv-n"><i class="csv-dot"></i>此刻 <b id="csvN" class="num">' + csNowBase ( ) . toLocaleString ( ) + '</b> 人正在测<span class="csv-av" id="csvAv">' + csAvs ( 5 ) + '</span>< /div>' +
'<div class="csv-r" id="csvR"></div></div>' ;
}
var csdBusy = false ;
/* 11-04 用户:「点摇一摇,整个页面上浮出一个动态效果,结束后再跳到那个测试」→ 全屏浮层:两颗大骰子翻滚 + 老虎机转测试名(越转越慢)→ 落定弹出那个测试的卡(分组配色 + 专属图标)+ 全屏撒彩纸 → 进入 */
function csdRoll ( btn ) {
if ( csdBusy ) return ; csdBusy = true ; haptic ( ) ; btn . classList . add ( 'roll' ) ;
var dn = csDone ( ) , pool = TM . filter ( function ( x ) { return ! dn [ x . id ] ; } ) ; if ( ! pool . length ) pool = TM ;
var pk = pool [ Math . floor ( Math . random ( ) * pool . length ) ] , w = document . getElementById ( 'csdW' ) , dcs = btn . querySelectorAll ( '.luck-dc' ) , i = 0 , steps = 16 ;
( function spin ( ) {
var pk = pool [ Math . floor ( Math . random ( ) * pool . length ) ] , i = 0 , steps = 18 ;
var ov = document . createElement ( 'div' ) ; ov . className = 'lko' ;
ov . innerHTML = '<div class="lko-bg"></div><div class="lko-in"><div class="lko-dc"><span class="a">' + diceSVG ( 6 ) + '</span><span class="b">' + diceSVG ( 3 ) + '</span></div>' +
'<p class="lko-tip">手气摇号中…</p><div class="lko-reel"><span id="lkoR">? </span></div><div class="lko-card" id="lkoC"></div></div><div class="lko-fx" id="lkoFx"></div>' ;
document . body . appendChild ( ov ) ; void ov . offsetWidth ; ov . classList . add ( 'on' ) ;
var R = ov . querySelector ( '#lkoR' ) , dcs = ov . querySelectorAll ( '.lko-dc span' ) ;
setTimeout ( function spin ( ) {
var last = i >= steps , t = last ? pk : TM [ Math . floor ( Math . random ( ) * TM . length ) ] ;
w . innerHTML = '<span class="' + ( last ? 'hit' : 'sp' ) + '">' + esc ( last ? t . title . replace ( /^测一测|/ , '' ) : ( CS _SHORT [ t . id ] || t . title ) ) + '</span>' ;
R . className = '' ; void R . offsetWidth ; R . className = last ? 'hit' : 'sp' ; R . textContent = CS _SHORT [ t . id ] || t . title ;
[ ] . forEach . call ( dcs , function ( d ) { d . innerHTML = diceSVG ( 1 + Math . floor ( Math . random ( ) * 6 ) ) ; } ) ;
if ( ! last ) { i ++ ; setTimeout ( spin , 40 + i * i * 1.1 ) ; return ; }
btn . c lassList . remove ( 'roll' ) ; btn . classList . add ( 'hit' ) ; haptic ( ) ; var bb = btn . querySelector ( '.luck-b' ) ; if ( bb ) bb . textContent = '就它了!' ;
var fx = document . getElementByI d( 'csdFx ' ) , cols = [ '#FF8A65' , '#9A7FE0' , '#3FAE7A' , '#4E8DE6' , '#FFC94D' , '#F0453A' ] , h = '' ;
for ( var k = 0 ; k < 18 ; k ++ ) { var a = k / 18 * 6.283 , r = 40 + Math . random ( ) * 40 ; h += '<i style="--x:' + Math . round ( Math . cos ( a ) * r ) + 'px;--y:' + Math . round ( Math . sin ( a ) * r * . 6 ) + 'px;background:' + cols [ k % 6 ] + '"></i>' ; }
if ( i % 3 === 0 && navigator . vibrate ) try { navigator . vibrate ( 8 ) ; } catch ( e ) { }
if ( ! last ) { i ++ ; setTimeout ( spin , 45 + i * i * 1.15 ) ; return ; }
ov . classList . ad d( 'hit ' ) ; haptic ( ) ;
ov . querySelector ( '.lko-tip' ) . textContent = '就它了!' ;
ov . querySelector ( '#lkoC' ) . innerHTML = '<div class="ck ' + CS _GPAL [ pk . group ] + '"><span class="cv">' + ( CS _BLOBS [ pk . group ] || CS _BLOB ) + '<i class="ck-wm">' + csTI ( pk ) + '</i><i class="lko-ic">' + csTI ( pk ) + '</i>' +
'<b>' + esc ( pk . title . replace ( /^测一测|/ , '' ) ) + '</b><small>' + TG [ pk . group ] + ' · ' + pk . n + ' 题</small><em>马上开测</em></span></div>' ;
var fx = ov . querySelector ( '#lkoFx' ) , cols = [ '#FF8A65' , '#9A7FE0' , '#3FAE7A' , '#4E8DE6' , '#FFC94D' , '#F0453A' , '#FF8FB1' ] , h = '' ;
for ( var k = 0 ; k < 46 ; k ++ ) {
var ag = Math . random ( ) * 6.283 , r = 120 + Math . random ( ) * 200 ;
h += '<i style="--x:' + Math . round ( Math . cos ( ag ) * r ) + 'px;--y:' + Math . round ( Math . sin ( ag ) * r - 60 ) + 'px;--r:' + Math . round ( Math . random ( ) * 720 ) + 'deg;background:' + cols [ k % 7 ] + ';animation-delay:' + Math . round ( Math . random ( ) * 120 ) + 'ms;' + ( k % 3 ? '' : 'border-radius:50%;' ) + '"></i>' ;
}
fx . innerHTML = h ;
setTimeout ( function ( ) { location . href = ceshiURL ( pk . id , true ) ; } , 11 00 ) ;
} ) ( ) ;
setTimeout ( function ( ) { location . href = ceshiURL ( pk . id , true ) ; } , 15 00 ) ;
} , 260 ) ;
}
window . addEventListener ( 'pageshow' , function ( ) { csdBusy = false ; var b = document . getElementById ( 'csvGo' ) ; if ( b ) { b . classList . remove ( 'roll' , 'hit' ) ; var bb = b . querySelector ( '.luck-b' ) ; if ( bb ) bb . textContent = '摇一摇' ; } } ) ;
var csvT = 0 , csvI = 0 , csvRec = [ ] ;
window . addEventListener ( 'pageshow' , function ( ) { csdBusy = false ; [ ] . forEach . call ( document . querySelectorAll ( '.lko' ) , function ( o ) { o . parentNode . removeChild ( o ) ; } ) ; var b = document . getElementById ( 'csvGo' ) ; if ( b ) { b . classList . remove ( 'roll' , 'hit' ) ; var bb = b . querySelector ( '.luck-b' ) ; if ( bb ) bb . textContent = '摇一摇' ; } } ) ;
var csvT = 0 , csvI = 0 , csvRec = [ ] , csvRecT = [ ] ;
function csvOne ( ) {
var R = window . GC _RES || { } , ids = TM . filter ( function ( x ) { return R [ x . id ] && R [ x . id ] . length ; } ) ;
if ( ! ids . length ) return '' ;
var tp = ids . filter ( function ( x ) { return csvRecT . indexOf ( x . id ) < 0 ; } ) ; if ( tp . length ) ids = tp ;
var t = ids [ Math . floor ( Math . random ( ) * ids . length ) ] , rs = R [ t . id ] , r = rs [ Math . floor ( Math . random ( ) * rs . length ) ] , k , c = [ ] ;
csvRecT . push ( t . id ) ; if ( csvRecT . length > 6 ) csvRecT . shift ( ) ; /* 最近 6 条不出同一个测试 */
for ( k = 0 ; k < CL _NM . length ; k ++ ) if ( csvRec . indexOf ( k ) < 0 ) c . push ( k ) ;
k = c [ Math . floor ( Math . random ( ) * c . length ) ] ; csvRec . push ( k ) ; if ( csvRec . length > 14 ) csvRec . shift ( ) ;
return '<button type="button" class="csv-i" data-test="' + t . id + '"><img src="../assets/img/mom/' + CL _AV [ k ] + '.jpg" alt="" width="20 " height="20 ">' +
k = c [ Math . floor ( Math . random ( ) * c . length ) ] ; csvRec . push ( k ) ; if ( csvRec . length > 14 ) csvRec . shift ( ) ; /* 同屏 3 行 + 最近 14 个人不重复 */
return '<button type="button" class="csv-i" data-test="' + t . id + '"><img src="../assets/img/mom/' + CL _AV [ k ] + '.jpg" alt="" width="22 " height="22 ">' +
'<span><em>' + esc ( CL _NM [ k ] ) + '</em>刚测出<b>「' + esc ( r ) + '」</b></span><small>' + esc ( CS _SHORT [ t . id ] || '' ) + '</small></button>' ;
}
/* 11-04 用户:「此刻正在测下面一行太少,最多三行滚动」→ 同屏 3 行,新的一条从底下推上来,最上面那条淡出 */
var CSV _H = 30 ;
function csvLay ( b ) { [ ] . forEach . call ( b . querySelectorAll ( '.csv-i:not(.gone)' ) , function ( el , i ) { el . style . transform = 'translateY(' + i * CSV _H + 'px)' ; el . style . opacity = i > 2 ? 0 : 1 ; } ) ; }
function csLiveRun ( ) {
clearInterval ( csvT ) ;
var box = $ ( '#csvR' ) ; if ( ! box ) return ;
box . innerHTML = csvOne ( ) ; if ( box . firstChild ) box . firstChild . classList . add ( 'on' ) ;
box . innerHTML = csvOne ( ) + csvOne ( ) + csvOne ( ) ; csvLay ( box ) ;
var base = csNowBase ( ) , n = base , tick = 0 ;
csvT = setInterval ( function ( ) {
if ( document . hidden || ! document . getElementById ( 'csvR' ) ) return ;
tick ++ ;
if ( tick % 2 === 0 ) { /* 战报 每 2.6 秒换 一条 */
var b = document . getElementById ( 'csvR' ) , old = b . querySelector ( '.csv-i.on ' ) ;
if ( tick % 2 === 0 ) { /* 每 2.6 秒推上来 一条 */
var b = document . getElementById ( 'csvR' ) , first = b . querySelector ( '.csv-i:not(.gone) ' ) ;
b . insertAdjacentHTML ( 'beforeend' , csvOne ( ) ) ;
var nw = b . lastElementChild ; void nw . offsetWidth ; nw . classList . add ( 'on' ) ;
if ( old ) { old . classList . remove ( 'on' ) ; old . classList . add ( 'up' ) ; setTimeout ( function ( ) { if ( old . parentNode ) old . parentNode . removeChild ( old ) ; } , 4 50) ; }
var nw = b . lastElementChild ; nw . style . transform = 'translateY(' + 3 * CSV _H + 'px)' ; nw . style . opacity = 0 ; void nw . offsetWidth ;
if ( first ) { first . classList . add ( 'g one ' ) ; first . style . transform = 'translateY(' + - CSV _H + 'px)' ; first . style . opacity = 0 ; setTimeout ( function ( ) { if ( first . parentNode ) first . parentNode . removeChild ( first ) ; } , 50 0 ) ; }
csvLay ( b ) ;
}
if ( tick % 3 === 0 ) { /* 头像堆换一个人 */
var av = document . querySelectorAll ( '#csvAv img' ) ; if ( av . length ) { var im = av [ Math . floor ( Math . random ( ) * av . length ) ] ; im . classList . add ( 'sw' ) ; setTimeout ( function ( ) { im . src = '../assets/img/mom/' + CS _AVP [ csAvK ++ % CS _AVP . length ] + '.jpg' ; im . classList . remove ( 'sw' ) ; } , 220 ) ; }
}
n = Math . max ( Math . round ( base * . 93 ) , Math . min ( Math . round ( base * 1.07 ) , n + Math . round ( ( Math . random ( ) - . 45 ) * 14 ) ) ) ;
var e = document . getElementById ( 'csvN' ) ; if ( e ) { e . textContent = n . toLocaleString ( ) ; e . classList . remove ( 'bp' ) ; void e . offsetWidth ; e . classList . add ( 'bp' ) ; }
@@ -1164,12 +1295,12 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
[ ] . forEach . call ( els , function ( el ) { el . classList . add ( 'pre' ) ; io . observe ( el ) ; } ) ;
}
function ceshiListHTML ( ) {
var done = csDone ( ) , gs = [ 'quiz' , 'psy' , 'game' , 'shop' ] . filter ( function ( g ) { return ! tGrp || tGrp === g ; } ) , k = 0 ;
var done = csDone ( ) , gs = [ 'quiz' , 'psy' , 'game' , 'shop' ] . filter ( function ( g ) { return ! tGrp || tGrp === g ; } ) , k = 0 ; csAvK = 0 ;
return '<div class="csl">' + gs . map ( function ( g , gi ) {
var l = byHot ( TM . filter ( function ( x ) { return x . group === g ; } ) ) ; if ( ! l . length ) return '' ;
var c = CS _SEC [ g ] , nc = Math . min ( 6 , l . length - l . length % 2 ) ;
return ( gi ? '<div class="csd"><span>' + ( gi === 1 && ! tGrp ? '点上方标签,可以只看某一类' : '继续往下看' ) + '</span></div>' : '' ) +
'<section class="csg g-' + g + '"><div class="csg-h"><b><i class="csg-ic">' + CS _ICO [ g ] + '</i>' + TG [ g ] + '</b><small>' + c [ 1 ] + '</small></div>' +
'<section class="csg g-' + g + '"><i class="csg-deco" aria-hidden="true">' + CS _ICO [ g ] + '</i>< div class="csg-h"><b><i class="csg-ic">' + CS _ICO [ g ] + '</i>' + TG [ g ] + '<span class="csg-n">' + csAvs ( 4 ) + Math . round ( l . reduce ( function ( a , x ) { return a + gcTested ( x . id ) ; } , 0 ) / 1e4 ) + ' 万人测过</span>< /b><small>' + c [ 1 ] + '</small></div>' +
'<div class="ckg c2">' + l . slice ( 0 , nc ) . map ( function ( x ) { return csCardHTML ( x , done , k ++ ) ; } ) . join ( '' ) + '</div>' +
( l . length > nc ? '<div class="csrl">' + l . slice ( nc ) . map ( function ( x ) { return csRowHTML ( x , done , k ++ ) ; } ) . join ( '' ) + '</div>' : '' ) + '</section>' ;
} ) . join ( '' ) + '</div>' ;