@@ -144,18 +144,37 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
. cst button . on { background : linear-gradient ( 135 deg , #EFEAFF , #E6F0FF ) ; border-color : #D9D0FA ; color : #4F45B5 ; font-weight : 900 }
. cst button . on { background : linear-gradient ( 135 deg , #EFEAFF , #E6F0FF ) ; border-color : #D9D0FA ; color : #4F45B5 ; font-weight : 900 }
. csg { margin-top : 22 px }
. csg { margin-top : 22 px }
/* 11-04 测试列表「热闹」:实时在测 + 战报 + 手气测 + 卡片在测 / TOP / 弹入 / 扫光 */
/* 11-04 测试列表「热闹」:实时在测 + 战报 + 手气测 + 卡片在测 / TOP / 弹入 / 扫光 */
. csv { display : grid ; grid-template-columns : 1 fr auto ; align-items : center ; gap : 8 px 10 px ; margin : 10 px 12 px 0 ; padding : 10 px 12 px ; border-radius : 16 px ; background : linear-gradient ( 135 deg , #FFF1EA , #FFF7F0 60 % , #F6F0FF ) ; box-shadow : 0 4 px 14 px -8 px rgba ( 240 , 112 , 79 , .35 ) }
. luck { position : relative ; display : flex ; align-items : center ; gap : 10 px ; width : calc ( 100 % - 24 px ) ;margin : 12 px 12 px 0 ; padding : 14 px 12 px 14 px 14 px ; border-radius : 20 px ; text-align : left ; color : #fff ;
background : radial-gradient ( circle at 88 % 0 , rgba ( 255 , 255 , 255 , .28 ) 0 38 px , transparent 39 px ) , radial-gradient ( circle at 6 % 120 % , rgba ( 255 , 201 , 77 , .45 ) 0 46 px , transparent 47 px ) , linear-gradient ( 120 deg , #7B5CF5 , #A17BFF 55 % , #FF8FB1 ) ; box-shadow : 0 10 px 22 px -10 px rgba ( 123 , 92 , 245 , .7 ) ; overflow : visible }
. luck-dc { flex : none ; width : 46 px ; height : 46 px ; filter : drop-shadow ( 0 4 px 6 px rgba ( 60 , 30 , 140 , .35 ) ) ; animation : lkIdle 3.2 s ease-in-out infinite ; transform-origin : 50 % 60 % }
. luck-dc svg { width : 100 % ; height : 100 % ; display : block }
. luck-dc . d2 { position : absolute ; left : 44 px ; top : 6 px ; width : 24 px ; height : 24 px ; animation-delay : .4 s }
@ keyframes lkIdle { 0 % , 72 % , 100 % { transform : rotate ( 0 ) } 78 % { transform : rotate ( -14 deg ) translateY ( -3 px ) } 86 % { transform : rotate ( 10 deg ) translateY ( -1 px ) } 93 % { transform : rotate ( -4 deg ) } }
. luck . roll . luck-dc { animation : lkTumble .35 s linear infinite }
. luck . roll . luck-dc . d2 { animation-duration : .28 s }
@ keyframes lkTumble { 0 % { transform : rotate ( 0 ) translateY ( 0 ) } 25 % { transform : rotate ( 90 deg ) translateY ( -6 px ) } 50 % { transform : rotate ( 180 deg ) translateY ( 0 ) } 75 % { transform : rotate ( 270 deg ) translateY ( -4 px ) } 100 % { transform : rotate ( 360 deg ) } }
. luck . hit . luck-dc { animation : lkLand .5 s cubic-bezier ( .3 , 1.6 , .5 , 1 ) }
@ keyframes lkLand { from { transform : scale ( 1.3 ) rotate ( -20 deg ) } to { transform : none } }
. luck-t { flex : 1 ; min-width : 0 ; display : flex ; flex-direction : column ; gap : 5 px ; padding-left : 4 px }
. luck-t > b { font-size : 16.5 px ; font-weight : 900 ; letter-spacing : .3 px ; text-shadow : 0 1 px 2 px rgba ( 60 , 30 , 140 , .25 ) }
. luck-w { display : block ; height : 22 px ; line-height : 22 px ; padding : 0 9 px ; border-radius : 8 px ; background : rgba ( 255 , 255 , 255 , .22 ) ; font-size : 12 px ; font-weight : 700 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis }
. luck-w . sp { display : inline-block ; animation : lkSp .09 s linear }
@ keyframes lkSp { from { transform : translateY ( -70 % ) ; opacity : .3 } }
. luck-w . hit { display : inline-block ; color : #FFE27A ; font-weight : 900 ; animation : lkLand .45 s cubic-bezier ( .3 , 1.6 , .5 , 1 ) }
. luck-b { flex : none ; height : 34 px ; padding : 0 14 px ; border-radius : 99 px ; background : #fff ; color : #6A4BE0 ; font-size : 14 px ; font-style : normal ; font-weight : 900 ; line-height : 34 px ; box-shadow : 0 4 px 10 px -4 px rgba ( 60 , 30 , 140 , .5 ) ; animation : lkPulse 1.8 s ease-in-out infinite }
@ keyframes lkPulse { 50 % { transform : scale ( 1.07 ) } }
. luck . roll . luck-b , . luck . hit . luck-b { animation : none ; opacity : .6 }
. luck : active { transform : scale ( .985 ) }
. luck-fx { position : absolute ; left : 50 % ; top : 50 % ; pointer-events : none }
. luck-fx i { position : absolute ; width : 7 px ; height : 7 px ; border-radius : 2 px ; animation : lkBoom .9 s ease-out forwards }
@ keyframes lkBoom { from { transform : translate ( 0 , 0 ) scale ( 1 ) ; opacity : 1 } to { transform : translate ( var ( - - x ) , var ( - - y ) ) rotate ( 200 deg ) scale ( .4 ) ; opacity : 0 } }
. csv { display : grid ; grid-template-columns : 1 fr ; gap : 6 px ; margin : 10 px 12 px 0 ; padding : 10 px 12 px ; border-radius : 16 px ; background : linear-gradient ( 135 deg , #FFF1EA , #FFF7F0 60 % , #F6F0FF ) ; box-shadow : 0 4 px 14 px -8 px rgba ( 240 , 112 , 79 , .35 ) }
. csv-n { font-size : 13 px ; font-weight : 700 ; color : #6E5A55 ; display : flex ; align-items : center ; gap : 6 px }
. csv-n { font-size : 13 px ; font-weight : 700 ; color : #6E5A55 ; display : flex ; align-items : center ; gap : 6 px }
. csv-n b { font-size : 17 px ; font-weight : 900 ; color : #F0453A ; display : inline-block }
. csv-n b { font-size : 17 px ; font-weight : 900 ; color : #F0453A ; display : inline-block }
. csv-n b . bp { animation : csvBp .5 s ease }
. csv-n b . bp { animation : csvBp .5 s ease }
@ keyframes csvBp { 40 % { transform : translateY ( -2 px ) scale ( 1.08 ) } }
@ keyframes csvBp { 40 % { transform : translateY ( -2 px ) scale ( 1.08 ) } }
. csv-dot { width : 8 px ; height : 8 px ; border-radius : 50 % ; background : #F0453A ; box-shadow : 0 0 0 0 rgba ( 240 , 69 , 58 , .5 ) ; animation : csvDot 1.4 s ease-out infinite }
. csv-dot { width : 8 px ; height : 8 px ; border-radius : 50 % ; background : #F0453A ; box-shadow : 0 0 0 0 rgba ( 240 , 69 , 58 , .5 ) ; animation : csvDot 1.4 s ease-out infinite }
@ keyframes csvDot { 70 % { box-shadow : 0 0 0 7 px rgba ( 240 , 69 , 58 , 0 ) } 100 % { box-shadow : 0 0 0 0 rgba ( 240 , 69 , 58 , 0 ) } }
@ keyframes csvDot { 70 % { box-shadow : 0 0 0 7 px rgba ( 240 , 69 , 58 , 0 ) } 100 % { box-shadow : 0 0 0 0 rgba ( 240 , 69 , 58 , 0 ) } }
. csv-go { display : inline-flex ; align-items : center ; gap : 4 px ; height : 30 px ; padding : 0 12 px 0 8 px ; border-radius : 99 px ; background : linear-gradient ( 135 deg , #8D6BFF , #B08CFF ) ; color : #fff ; font-size : 12.5 px ; font-weight : 800 ; box-shadow : 0 4 px 10 px -4 px #8D6BFF }
. csv-go svg { width : 18 px ; height : 18 px ; color : #fff ; opacity : .95 }
. csv-go svg rect { fill : rgba ( 255 , 255 , 255 , .28 ) }
. csv-go . roll svg { animation : csvRoll .65 s cubic-bezier ( .3 , 1.4 , .6 , 1 ) }
@ keyframes csvRoll { to { transform : rotate ( 720 deg ) scale ( 1.15 ) } }
. csv-r { grid-column : 1 /- 1 ; position : relative ; height : 24 px ; overflow : hidden }
. csv-r { grid-column : 1 /- 1 ; position : relative ; height : 24 px ; overflow : hidden }
. csv-i { position : absolute ; inset : 0 ; display : flex ; align-items : center ; gap : 6 px ; width : 100 % ; font-size : 12.5 px ; color : #7A6863 ; text-align : left ; opacity : 0 ; transform : translateY ( 100 % ) ; transition : transform .45 s ease , opacity .45 s ease }
. csv-i { position : absolute ; inset : 0 ; display : flex ; align-items : center ; gap : 6 px ; width : 100 % ; font-size : 12.5 px ; color : #7A6863 ; text-align : left ; opacity : 0 ; transform : translateY ( 100 % ) ; transition : transform .45 s ease , opacity .45 s ease }
. csv-i . on { opacity : 1 ; transform : none } . csv-i . up { opacity : 0 ; transform : translateY ( -100 % ) }
. csv-i . on { opacity : 1 ; transform : none } . csv-i . up { opacity : 0 ; transform : translateY ( -100 % ) }
@@ -164,21 +183,15 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
. csv-i em { font-style : normal ; font-weight : 800 ; color : #3A2A26 ; margin-right : 4 px }
. csv-i em { font-style : normal ; font-weight : 800 ; color : #3A2A26 ; margin-right : 4 px }
. csv-i b { font-weight : 800 ; color : #8D6BFF }
. csv-i b { font-weight : 800 ; color : #8D6BFF }
. csv-i small { flex : none ; font-size : 11 px ; color : #B5A39C }
. csv-i small { flex : none ; font-size : 11 px ; color : #B5A39C }
. ck . cv . ck-live { position : absolute ; left : 7 px ; top : 7 px ; z-index : 1 ; display : inline-flex ; align-items : center ; gap : 3 px ; height : 19 px ; padding : 0 7 px 0 6 px ; border-radius : 99 px ; background : rgba ( 255 , 255 , 255 , .82 ) ; color : #6E5A55 ; font-size : 10 px ; font-style : normal ; font-weight : 700 }
. ck . cv . ck-live > i { width : 6 px ; height : 6 px ; border-radius : 50 % ; background : #2EC47A ; box-shadow : 0 0 0 0 rgba ( 46 , 196 , 122 , .5 ) ; animation : csvDot2 1.6 s ease-out infinite }
@ keyframes csvDot2 { 70 % { box-shadow : 0 0 0 5 px rgba ( 46 , 196 , 122 , 0 ) } 100 % { box-shadow : 0 0 0 0 rgba ( 46 , 196 , 122 , 0 ) } }
# more . ck . cv . ck-live b { margin : 0 ; padding : 0 ; font-size : 11 px ; line-height : 1 ; color : #2A1E1E ; font-weight : 900 ; font-variant-numeric : tabular-nums ; -webkit- line-clamp : unset ; display : inline }
# more . ck . cv . ck-live . bp b { animation : csvBp .5 s ease ; display : inline-block ; color : #F0453A }
. ck . cv . ck-top { position : absolute ; right : 0 ; top : 0 ; z-index : 1 ; height : 20 px ; padding : 0 8 px 0 9 px ; border-radius : 0 0 0 12 px ; color : #fff ; font-size : 10.5 px ; font-style : italic ; font-weight : 900 ; line-height : 20 px ; letter-spacing : .3 px }
. ck . cv . ck-top { position : absolute ; right : 0 ; top : 0 ; z-index : 1 ; height : 20 px ; padding : 0 8 px 0 9 px ; border-radius : 0 0 0 12 px ; color : #fff ; font-size : 10.5 px ; font-style : italic ; font-weight : 900 ; line-height : 20 px ; letter-spacing : .3 px }
. ck-top . t1 { background : linear-gradient ( 135 deg , #F0453A , #FF8A3D ) } . ck-top . t2 { background : linear-gradient ( 135 deg , #FF8A2E , #FFC06E ) } . ck-top . t3 { background : linear-gradient ( 135 deg , #8D6BFF , #B9A3FF ) }
. ck-top . t1 { background : linear-gradient ( 135 deg , #F0453A , #FF8A3D ) } . ck-top . t2 { background : linear-gradient ( 135 deg , #FF8A2E , #FFC06E ) } . ck-top . t3 { background : linear-gradient ( 135 deg , #8D6BFF , #B9A3FF ) }
. ck . cv i . dn { top : 30 px }
. ck . cv em { position : relative ; overflow : hidden }
. ck . cv em { position : relative ; overflow : hidden }
. ck . cv em :: after { content : "" ; position : absolute ; top : 0 ; bottom : 0 ; left : -60 % ; width : 40 % ; background : linear-gradient ( 100 deg , transparent , rgba ( 255 , 255 , 255 , .55 ) , transparent ) ; transform : skewX ( -18 deg ) ; animation : ckShine 3.6 s ease-in-out infinite }
. ck . cv em :: after { content : "" ; position : absolute ; top : 0 ; bottom : 0 ; left : -60 % ; width : 40 % ; background : linear-gradient ( 100 deg , transparent , rgba ( 255 , 255 , 255 , .55 ) , transparent ) ; transform : skewX ( -18 deg ) ; animation : ckShine 3.6 s ease-in-out infinite }
@ keyframes ckShine { 0 % , 62 % { left : -60 % } 88 % , 100 % { left : 130 % } }
@ keyframes ckShine { 0 % , 62 % { left : -60 % } 88 % , 100 % { left : 130 % } }
. pre { opacity : 0 }
. pre { opacity : 0 }
. pre . pop-in { animation : ckPop .5 s cubic-bezier ( .3 , 1.35 , .5 , 1 ) both }
. pre . pop-in { animation : ckPop .5 s cubic-bezier ( .3 , 1.35 , .5 , 1 ) both }
@ keyframes ckPop { from { opacity : 0 ; transform : translateY ( 14 px ) scale ( .96 ) } to { opacity : 1 ; transform : none } }
@ keyframes ckPop { from { opacity : 0 ; transform : translateY ( 14 px ) scale ( .96 ) } to { opacity : 1 ; transform : none } }
@ media ( prefers-reduced-motion : reduce ) { . pre { opacity : 1 } . pre . pop-in , . ck . cv em :: after , . csv-dot , . ck . cv . ck-live > i { animation : none } }
@ media ( prefers-reduced-motion : reduce ) { . luck-dc , . luck-b { animation : none } . pre{ opacity : 1 } . pre . pop-in , . ck . cv em :: after , . csv-dot { animation : none } }
. csg-h { display : flex ; flex-direction : column ; gap : 5 px ; padding : 0 2 px }
. csg-h { display : flex ; flex-direction : column ; gap : 5 px ; padding : 0 2 px }
. csg-h b { display : flex ; align-items : center ; gap : 6 px ; padding-left : 10 px ; border-left : 3 px solid #B9B3D6 ; font-size : 19 px ; font-weight : 900 ; line-height : 1.1 ; color : #2B2433 }
. csg-h b { display : flex ; align-items : center ; gap : 6 px ; padding-left : 10 px ; border-left : 3 px solid #B9B3D6 ; font-size : 19 px ; font-weight : 900 ; line-height : 1.1 ; color : #2B2433 }
. csg-h b i { font-style : normal ; font-size : 18 px }
. csg-h b i { font-style : normal ; font-size : 18 px }
@@ -219,7 +232,8 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
. c2 . ck . cv b { font-size : 15.5 px ; padding : 0 6 px }
. c2 . ck . cv b { font-size : 15.5 px ; padding : 0 6 px }
. ck . cv { height : 146 px }
. ck . cv { height : 146 px }
. c2 . ck . cv { height : 160 px }
. c2 . ck . cv { height : 160 px }
# more . ck . cv { padding-top : 22 px ; height : 166 px } # more . c2 . ck . cv { height : 178 px }
# more . ck . cv { padding-top : 14 px ; height : 160 px } # more . c2 . ck . cv { height : 172 px }
# more . ck . cv b { font-size : 15.5 px ; line-height : 1.32 } # more . c2 . ck . cv b { font-size : 17 px ; padding : 0 4 px }
. ck . cnn { margin-top : 8 px }
. ck . cnn { margin-top : 8 px }
. ck . cv small { font-size : 10.5 px ; color : #8D8091 ; white-space : nowrap }
. ck . cv small { font-size : 10.5 px ; color : #8D8091 ; white-space : nowrap }
. ck . cv em { margin-top : 2 px ; height : 22 px ; padding : 0 10 px ; border-radius : 6 px ; background : var ( - - cb ) ; color : #fff ; font-size : 11 px ; font-style : normal ; font-weight : 800 ; line-height : 22 px ; box-shadow : 0 3 px 8 px -3 px var ( - - cb ) }
. ck . cv em { margin-top : 2 px ; height : 22 px ; padding : 0 10 px ; border-radius : 6 px ; background : var ( - - cb ) ; color : #fff ; font-size : 11 px ; font-style : normal ; font-weight : 800 ; line-height : 22 px ; box-shadow : 0 3 px 8 px -3 px var ( - - cb ) }
@@ -748,10 +762,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 id = "sheet" role = "dialog" aria-modal = "true" > < i class = "sg" > < / i > < div class = "sbd" id = "sbd" > < / div > < / div >
< div class = "toast" id = "toast" > < / div >
< div class = "toast" id = "toast" > < / div >
< script src = "topics.js?v=26110291 " > < / script >
< script src = "topics.js?v=26110292 " > < / script >
< script src = "data.js?v=26110291 " > < / script >
< script src = "data.js?v=26110292 " > < / script >
< script src = "feed.js?v=26110291 " > < / script >
< script src = "feed.js?v=26110292 " > < / script >
< script src = "ceshi/meta.js?v=26110291 " > < / script >
< script src = "ceshi/meta.js?v=26110292 " > < / script >
< script >
< script >
( function ( ) {
( function ( ) {
'use strict' ;
'use strict' ;
@@ -817,7 +831,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
var CMD = null , CMERR = false ;
var CMD = null , CMERR = false ;
/* 头像编码:数字 = av/NNNN.webp( 旧代码头像) ; 'av:c012' = av/c012.webp( 卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
/* 头像编码:数字 = 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' ; } ;
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=26110291 ' ) . then ( function ( r ) { return r . json ( ) ; } ) . then ( function ( j ) {
fetch ( 'cm.json?v=26110292 ' ) . then ( function ( r ) { return r . json ( ) ; } ) . then ( function ( j ) {
CMD = j ; if ( openId && NBY [ openId ] ) { renderComments ( NBY [ openId ] ) ; syncBar ( NBY [ openId ] ) ; }
CMD = j ; if ( openId && NBY [ openId ] ) { renderComments ( NBY [ openId ] ) ; syncBar ( NBY [ openId ] ) ; }
} ) . catch ( function ( ) { CMERR = true ; if ( openId && NBY [ openId ] ) renderComments ( NBY [ openId ] ) ; } ) ;
} ) . catch ( function ( ) { CMERR = true ; if ( openId && NBY [ openId ] ) renderComments ( NBY [ openId ] ) ; } ) ;
function commentsOf ( n ) {
function commentsOf ( n ) {
@@ -1063,9 +1077,9 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
} ;
} ;
function csCardHTML ( x , done , i ) {
function csCardHTML ( x , done , i ) {
var d = done [ x . id ] , who = ( x . sub || '' ) . split ( '·' ) [ 0 ] . trim ( ) ;
var d = done [ x . id ] , who = ( x . sub || '' ) . split ( '·' ) [ 0 ] . trim ( ) ;
var top = byHot ( TM ) . slice ( 0 , 3 ) . map ( function ( y ) { return y . id ; } ) . indexOf ( x . id ) , nw = csNowOn ( x . id ) ;
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 ) +
return '<button type="button" class="ck ' + CS _GPAL [ x . group ] + '" data-test="' + x . id + '"><span class="cv">' + ( CS _BLOBS [ x . group ] || CS _BLOB ) +
'<i class="ck-live"><i></i><b data-v="' + nw + '">' + nw + '</b> 人在测</i>' + ( top >= 0 ? '<i class="ck-top t' + ( top + 1 ) + '">TOP' + ( top + 1 ) + '</i>' : '' ) +
( 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>' +
'<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>' ;
'<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>' ;
}
}
@@ -1079,13 +1093,39 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
'甜甜圈' , '小熊软糖' , '一颗青梅' , '冬冬妈' , '可乐加冰' , '麦穗儿' , '云朵朵' , '橘子汽水' , '乐乐的妈' , '荔枝' , '蜜桃乌龙' , '小葡萄' ] ;
'甜甜圈' , '小熊软糖' , '一颗青梅' , '冬冬妈' , '可乐加冰' , '麦穗儿' , '云朵朵' , '橘子汽水' , '乐乐的妈' , '荔枝' , '蜜桃乌龙' , '小葡萄' ] ;
var CL _AV = [ 'p02' , 'm05' , 'p05' , 'm12' , 'k04' , 'p09' , 'm16' , 'p11' , 'm07' , 'k10' , 'p03' , 'm19' , 'p13' , 'm02' , 'k06' , 'p06' , 'm10' , 'p12' , 'm21' , 'p07' , 'm04' , 'k12' , 'p14' , 'm15' ,
var CL _AV = [ 'p02' , 'm05' , 'p05' , 'm12' , 'k04' , 'p09' , 'm16' , 'p11' , 'm07' , 'k10' , 'p03' , 'm19' , 'p13' , 'm02' , 'k06' , 'p06' , 'm10' , 'p12' , 'm21' , 'p07' , 'm04' , 'k12' , 'p14' , 'm15' ,
'p01' , 'm01' , 'k01' , 'm03' , 'p04' , 'm06' , 'k02' , 'm08' , 'p08' , 'm09' , 'k03' , 'm11' ] ;
'p01' , 'm01' , 'k01' , 'm03' , 'p04' , 'm06' , 'k02' , 'm08' , 'p08' , 'm09' , 'k03' , 'm11' ] ;
var CS _DICE = '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="5" fill="currentColor"/><g fill="#fff"><circle cx="8" cy="8" r="1.7"/><circle cx="16" cy="8" r="1.7"/><circle cx="12" cy="12" r="1.7"/><circle cx="8" cy="16" r="1.7"/><circle cx="16" cy="16" r="1.7"/></g></svg>' ;
/* 11-04 用户:「手气测挺好玩,要明显、让用户玩起来」→ 独立一块「摇一摇」:骰子闲时晃一晃;点了骰子翻滚、标题像老虎机一样转、越转越慢停在一个没测过的测试上,撒彩点后进入 */
var DICE _P = { 1 : [ [ 12 , 12 ] ] , 2 : [ [ 8 , 8 ] , [ 16 , 16 ] ] , 3 : [ [ 7 , 7 ] , [ 12 , 12 ] , [ 17 , 17 ] ] , 4 : [ [ 8 , 8 ] , [ 16 , 8 ] , [ 8 , 16 ] , [ 16 , 16 ] ] , 5 : [ [ 7 , 7 ] , [ 17 , 7 ] , [ 12 , 12 ] , [ 7 , 17 ] , [ 17 , 17 ] ] , 6 : [ [ 8 , 6.5 ] , [ 16 , 6.5 ] , [ 8 , 12 ] , [ 16 , 12 ] , [ 8 , 17.5 ] , [ 16 , 17.5 ] ] } ;
function diceSVG ( n ) {
return '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="2" y="2" width="20" height="20" rx="5.5" fill="#fff"/><rect x="2" y="17" width="20" height="5" rx="2.5" fill="#EDE6FF" opacity=".9"/>' +
DICE _P [ n ] . map ( function ( c ) { return '<circle cx="' + c [ 0 ] + '" cy="' + c [ 1 ] + '" r="2" fill="' + ( n === 1 ? '#F0453A' : '#6A4BE0' ) + '"/>' ; } ) . join ( '' ) + '</svg>' ;
}
function csNowBase ( ) { return Math . round ( TM . reduce ( function ( a , x ) { return a + gcTested ( x . id ) ; } , 0 ) / 1150 ) ; }
function csNowBase ( ) { return Math . round ( TM . reduce ( function ( a , x ) { return a + gcTested ( x . id ) ; } , 0 ) / 1150 ) ; }
function csLiveHTML ( ) {
function csLiveHTML ( ) {
return '<div class="csv"><div class="csv-n"><i class="csv-dot"></i>此刻 <b id="csvN" class="num">' + csNowBase ( ) . toLocaleString ( ) + '</b> 人正在测</div>' +
var left = TM . length - Object . keys ( csDone ( ) ) . filter ( function ( k ) { return TM . some ( function ( x ) { return x . id === k ; } ) ; } ) . length ;
'<button type="button" class="csv-go " id="csvGo">' + CS _DICE + '手气测</butto n>' +
return '<button type="button" class="luck " id="csvGo"><span class="luck-dc" id="csdDc">' + diceSVG ( 5 ) + '</span><span class="luck-dc d2">' + diceSVG ( 3 ) + '</spa n>' +
'<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-r" id="csvR"></div></div>' ;
'<div class="csv-r" id="csvR"></div></div>' ;
}
}
var csdBusy = false ;
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 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>' ;
[ ] . 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 . classList . remove ( 'roll' ) ; btn . classList . add ( 'hit' ) ; haptic ( ) ; var bb = btn . querySelector ( '.luck-b' ) ; if ( bb ) bb . textContent = '就它了!' ;
var fx = document . getElementById ( '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>' ; }
fx . innerHTML = h ;
setTimeout ( function ( ) { location . href = ceshiURL ( pk . id , true ) ; } , 1100 ) ;
} ) ( ) ;
}
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 = [ ] ;
var csvT = 0 , csvI = 0 , csvRec = [ ] ;
function csvOne ( ) {
function csvOne ( ) {
var R = window . GC _RES || { } , ids = TM . filter ( function ( x ) { return R [ x . id ] && R [ x . id ] . length ; } ) ;
var R = window . GC _RES || { } , ids = TM . filter ( function ( x ) { return R [ x . id ] && R [ x . id ] . length ; } ) ;
@@ -1112,17 +1152,8 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
}
}
n = Math . max ( Math . round ( base * . 93 ) , Math . min ( Math . round ( base * 1.07 ) , n + Math . round ( ( Math . random ( ) - . 45 ) * 14 ) ) ) ;
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' ) ; }
var e = document . getElementById ( 'csvN' ) ; if ( e ) { e . textContent = n . toLocaleString ( ) ; e . classList . remove ( 'bp' ) ; void e . offsetWidth ; e . classList . add ( 'bp' ) ; }
if ( tick % 3 === 0 ) { /* 随机两张卡的「在测」数小跳 */
var cs = document . querySelectorAll ( '#more .ck-live b' ) ;
for ( var q = 0 ; q < 2 && cs . length ; q ++ ) {
var x = cs [ Math . floor ( Math . random ( ) * cs . length ) ] , v = + x . dataset . v || 10 ;
v = Math . max ( 3 , v + ( Math . random ( ) < . 6 ? 1 : - 1 ) * ( 1 + Math . floor ( Math . random ( ) * 3 ) ) ) ; x . dataset . v = v ; x . textContent = v ;
x . parentNode . classList . remove ( 'bp' ) ; void x . parentNode . offsetWidth ; x . parentNode . classList . add ( 'bp' ) ;
}
}
} , 1300 ) ;
} , 1300 ) ;
}
}
function csNowOn ( id ) { var h = 0 ; for ( var i = 0 ; i < id . length ; i ++ ) h = ( h * 31 + id . charCodeAt ( i ) ) >>> 0 ; return 6 + h % 9 + Math . round ( gcTested ( id ) / 2600 ) ; }
function csFx ( ) { /* 卡片进屏错落弹入 */
function csFx ( ) { /* 卡片进屏错落弹入 */
var els = document . querySelectorAll ( '#more .ck, #more .csr' ) ;
var els = document . querySelectorAll ( '#more .ck, #more .csr' ) ;
if ( ! ( 'IntersectionObserver' in window ) ) return ;
if ( ! ( 'IntersectionObserver' in window ) ) return ;
@@ -1374,13 +1405,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
$ ( '#head' ) . addEventListener ( 'click' , function ( e ) {
$ ( '#head' ) . addEventListener ( 'click' , function ( e ) {
if ( e . target . closest ( '#qfBanner' ) ) { goQifu ( ) ; return ; }
if ( e . target . closest ( '#qfBanner' ) ) { goQifu ( ) ; return ; }
var cb = e . target . closest ( '.cbn[data-test], .csv-i[data-test]' ) ; if ( cb ) { haptic ( ) ; location . href = ceshiURL ( cb . dataset . test , true ) ; return ; }
var cb = e . target . closest ( '.cbn[data-test], .csv-i[data-test]' ) ; if ( cb ) { haptic ( ) ; location . href = ceshiURL ( cb . dataset . test , true ) ; return ; }
var dc = e . target . closest ( '#csvGo' ) ;
var dc = e . target . closest ( '#csvGo' ) ; if ( dc ) { csdRoll ( dc ) ; return ; }
if ( dc ) { /* 手气测:优先没测过的 */
haptic ( ) ; dc . 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 ) ] ;
setTimeout ( function ( ) { location . href = ceshiURL ( pk . id , true ) ; } , 650 ) ; return ;
}
var j = e . target . closest ( '[data-join]' ) ; if ( j ) { haptic ( ) ; openRule ( j . dataset . join ) ; return ; }
var j = e . target . closest ( '[data-join]' ) ; if ( j ) { haptic ( ) ; openRule ( j . dataset . join ) ; return ; }
if ( e . target . closest ( '[data-rule]' ) ) { openRule ( '' ) ; return ; }
if ( e . target . closest ( '[data-rule]' ) ) { openRule ( '' ) ; return ; }
if ( e . target . closest ( '[data-all]' ) ) { openTopics ( ) ; return ; }
if ( e . target . closest ( '[data-all]' ) ) { openTopics ( ) ; return ; }