map.wxss 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813
  1. .page {
  2. height: 100vh;
  3. position: relative;
  4. overflow: hidden;
  5. background: #dbeed4;
  6. color: #163020;
  7. }
  8. .app-edge-glow {
  9. position: absolute;
  10. inset: 0;
  11. border-radius: 0;
  12. pointer-events: none;
  13. z-index: 40;
  14. }
  15. .app-edge-glow--orange {
  16. animation: app-edge-breathe-orange 1.55s ease-in-out infinite;
  17. }
  18. .app-edge-glow--red {
  19. animation: app-edge-breathe-red 1.15s ease-in-out infinite;
  20. }
  21. .map-stage {
  22. position: absolute;
  23. inset: 0;
  24. overflow: hidden;
  25. background: #dbeed4;
  26. }
  27. .map-content {
  28. position: absolute;
  29. inset: 0;
  30. }
  31. .map-canvas {
  32. position: absolute;
  33. inset: 0;
  34. width: 100%;
  35. height: 100%;
  36. display: block;
  37. }
  38. .map-canvas--base {
  39. z-index: 1;
  40. }
  41. .map-canvas--labels {
  42. z-index: 2;
  43. pointer-events: none;
  44. }
  45. .map-stage__map-pulse {
  46. position: absolute;
  47. width: 44rpx;
  48. height: 44rpx;
  49. margin-left: -22rpx;
  50. margin-top: -22rpx;
  51. border-radius: 50%;
  52. pointer-events: none;
  53. z-index: 6;
  54. }
  55. .map-stage__map-pulse--control {
  56. animation: map-pulse-control 0.82s ease-out 1;
  57. }
  58. .map-stage__map-pulse--ready {
  59. animation: map-pulse-ready 0.72s ease-out 1;
  60. }
  61. .map-stage__map-pulse--finish {
  62. animation: map-pulse-finish 0.82s ease-out 1;
  63. }
  64. .map-stage__stage-fx {
  65. position: absolute;
  66. inset: 0;
  67. pointer-events: none;
  68. z-index: 5;
  69. }
  70. .map-stage__stage-fx--finish {
  71. animation: stage-fx-finish 0.76s ease-out 1;
  72. }
  73. .map-stage__overlay {
  74. position: absolute;
  75. inset: 0;
  76. display: flex;
  77. flex-direction: column;
  78. justify-content: flex-end;
  79. padding: 0 24rpx 248rpx;
  80. box-sizing: border-box;
  81. pointer-events: none;
  82. z-index: 4;
  83. }
  84. .map-stage__topbar {
  85. display: flex;
  86. align-items: flex-start;
  87. justify-content: flex-start;
  88. }
  89. .map-stage__meta {
  90. max-width: 68%;
  91. padding: 18rpx 20rpx 20rpx;
  92. border-radius: 28rpx;
  93. background: rgba(248, 251, 244, 0.92);
  94. box-shadow: 0 14rpx 36rpx rgba(22, 48, 32, 0.12);
  95. backdrop-filter: blur(12rpx);
  96. }
  97. .map-stage__eyebrow {
  98. font-size: 20rpx;
  99. letter-spacing: 4rpx;
  100. color: #5f7a65;
  101. }
  102. .map-stage__title {
  103. margin-top: 8rpx;
  104. font-size: 38rpx;
  105. font-weight: 600;
  106. }
  107. .map-stage__badge {
  108. display: inline-flex;
  109. margin-top: 14rpx;
  110. padding: 8rpx 18rpx;
  111. border-radius: 999rpx;
  112. background: rgba(22, 48, 32, 0.9);
  113. color: #f7fbf2;
  114. font-size: 22rpx;
  115. }
  116. .screen-button-layer {
  117. position: absolute;
  118. width: 116rpx;
  119. min-height: 116rpx;
  120. padding: 18rpx 0 14rpx;
  121. border-radius: 30rpx;
  122. background: rgba(248, 251, 244, 0.96);
  123. box-shadow: 0 14rpx 36rpx rgba(22, 48, 32, 0.14);
  124. display: flex;
  125. flex-direction: column;
  126. align-items: center;
  127. justify-content: center;
  128. box-sizing: border-box;
  129. z-index: 20;
  130. }
  131. .screen-button-layer__icon {
  132. position: relative;
  133. width: 54rpx;
  134. height: 32rpx;
  135. margin: 0 auto;
  136. border: 4rpx solid #163020;
  137. border-radius: 8rpx;
  138. box-sizing: border-box;
  139. }
  140. .screen-button-layer__line {
  141. position: absolute;
  142. left: 8rpx;
  143. right: 8rpx;
  144. bottom: 6rpx;
  145. height: 4rpx;
  146. border-radius: 999rpx;
  147. background: rgba(22, 48, 32, 0.3);
  148. }
  149. .screen-button-layer__stand {
  150. position: absolute;
  151. left: 50%;
  152. bottom: -12rpx;
  153. width: 18rpx;
  154. height: 4rpx;
  155. margin-left: -9rpx;
  156. border-radius: 999rpx;
  157. background: #163020;
  158. }
  159. .screen-button-layer__text {
  160. margin-top: 18rpx;
  161. text-align: center;
  162. font-size: 22rpx;
  163. font-weight: 600;
  164. color: #163020;
  165. line-height: 1.2;
  166. }
  167. .map-stage__bottom {
  168. display: flex;
  169. align-items: flex-end;
  170. justify-content: center;
  171. width: 100%;
  172. }
  173. .screen-button-layer--bottom-left {
  174. left: 24rpx;
  175. bottom: 244rpx;
  176. }
  177. .screen-button-layer--start-left {
  178. left: 24rpx;
  179. bottom: 378rpx;
  180. min-height: 96rpx;
  181. padding: 0 18rpx;
  182. background: rgba(255, 226, 88, 0.96);
  183. box-shadow: 0 14rpx 36rpx rgba(120, 89, 0, 0.2), 0 0 0 3rpx rgba(255, 246, 186, 0.38);
  184. }
  185. .screen-button-layer__text--start {
  186. margin-top: 0;
  187. font-size: 30rpx;
  188. font-weight: 800;
  189. color: #6d4b00;
  190. letter-spacing: 2rpx;
  191. }
  192. .map-side-toggle {
  193. position: absolute;
  194. left: 24rpx;
  195. z-index: 19;
  196. }
  197. .map-side-column {
  198. position: absolute;
  199. display: flex;
  200. flex-direction: column;
  201. gap: 16rpx;
  202. padding-top: 12rpx;
  203. z-index: 18;
  204. }
  205. .map-side-column--left {
  206. left: 24rpx;
  207. }
  208. .map-side-column--left-group {
  209. padding-top: 106rpx;
  210. }
  211. .map-side-column--right-main {
  212. right: 118rpx;
  213. }
  214. .map-side-column--right-sub {
  215. right: 24rpx;
  216. }
  217. .map-side-button {
  218. width: 78rpx;
  219. height: 78rpx;
  220. border-radius: 22rpx;
  221. background: rgba(248, 251, 244, 0.96);
  222. box-shadow: 0 10rpx 26rpx rgba(22, 48, 32, 0.14);
  223. display: flex;
  224. align-items: center;
  225. justify-content: center;
  226. box-sizing: border-box;
  227. }
  228. .map-side-button--default {
  229. background: rgba(248, 251, 244, 0.96);
  230. }
  231. .map-side-button--icon {
  232. width: 90rpx;
  233. height: 90rpx;
  234. padding: 0;
  235. background: transparent;
  236. box-shadow: none;
  237. border-radius: 0;
  238. }
  239. .map-side-button__image {
  240. width: 100%;
  241. height: 100%;
  242. }
  243. .map-side-button__rotate-image {
  244. width: 100%;
  245. height: 100%;
  246. border-radius: 16rpx;
  247. box-sizing: border-box;
  248. }
  249. .map-side-button__rotate-image--active {
  250. border: 1px solid rgba(231, 54, 33, 0.98);
  251. }
  252. .map-side-button--muted {
  253. background: rgba(229, 233, 230, 0.92);
  254. }
  255. .map-side-button--muted .map-side-button__action-image {
  256. opacity: 0.46;
  257. filter: grayscale(1);
  258. }
  259. .map-side-button--active {
  260. background: rgba(255, 226, 88, 0.98);
  261. box-shadow: 0 0 0 4rpx rgba(255, 241, 158, 0.18), 0 12rpx 28rpx rgba(120, 89, 0, 0.2);
  262. }
  263. .map-side-button__text {
  264. font-size: 18rpx;
  265. line-height: 1.1;
  266. font-weight: 700;
  267. color: #163020;
  268. text-align: center;
  269. letter-spacing: 1rpx;
  270. }
  271. .map-side-button__action-image {
  272. width: 100%;
  273. height: 100%;
  274. border-radius: 22rpx;
  275. }
  276. .map-side-button--active .map-side-button__action-image {
  277. opacity: 1;
  278. }
  279. .compass-widget {
  280. display: flex;
  281. flex-direction: column;
  282. align-items: center;
  283. gap: 6rpx;
  284. flex-shrink: 0;
  285. }
  286. .compass-widget__heading {
  287. font-size: 14rpx;
  288. line-height: 1;
  289. font-weight: 600;
  290. color: rgba(32, 42, 34, 0.72);
  291. text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.35);
  292. }
  293. .compass-widget__dial {
  294. position: relative;
  295. width: 196rpx;
  296. height: 196rpx;
  297. border-radius: 50%;
  298. background: radial-gradient(circle at 48% 44%, rgba(255, 255, 255, 0.3) 0%, rgba(242, 241, 214, 0.32) 46%, rgba(183, 188, 159, 0.4) 72%, rgba(64, 68, 58, 0.62) 100%);
  299. border: 2rpx solid rgba(18, 24, 18, 0.48);
  300. box-shadow: 0 6rpx 14rpx rgba(0, 0, 0, 0.14), inset 0 0 0 2rpx rgba(255, 255, 255, 0.24);
  301. overflow: hidden;
  302. }
  303. .compass-widget__dial--active {
  304. border-color: rgba(250, 252, 187, 0.98);
  305. box-shadow: 0 0 0 2rpx rgba(253, 255, 214, 0.92), 0 0 18rpx rgba(247, 255, 173, 0.46), 0 6rpx 14rpx rgba(0, 0, 0, 0.14), inset 0 0 0 2rpx rgba(255, 255, 255, 0.28);
  306. }
  307. .compass-widget__glass,
  308. .compass-widget__inner-shadow {
  309. position: absolute;
  310. inset: 0;
  311. border-radius: 50%;
  312. pointer-events: none;
  313. }
  314. .compass-widget__glass {
  315. background: radial-gradient(circle at 38% 30%, rgba(255, 255, 255, 0.24) 0%, rgba(255, 255, 255, 0.1) 24%, rgba(255, 255, 255, 0) 52%);
  316. }
  317. .compass-widget__inner-shadow {
  318. box-shadow: inset 0 0 0 12rpx rgba(0, 0, 0, 0.07), inset 0 0 18rpx rgba(255, 255, 255, 0.22);
  319. }
  320. .compass-widget__card {
  321. position: absolute;
  322. inset: 0;
  323. transform-origin: center;
  324. }
  325. .compass-widget__north-arrow {
  326. position: absolute;
  327. left: 50%;
  328. top: 50%;
  329. width: 54rpx;
  330. height: 176rpx;
  331. transform: translate(-50%, -52%);
  332. display: block;
  333. pointer-events: none;
  334. z-index: 1;
  335. opacity: 0.42;
  336. }
  337. .compass-widget__north-arrow-outline,
  338. .compass-widget__north-arrow-fill,
  339. .compass-widget__north-arrow-tail-outline,
  340. .compass-widget__north-arrow-tail-fill {
  341. display: none;
  342. }
  343. .compass-widget__tick-anchor,
  344. .compass-widget__mark-anchor,
  345. .compass-widget__needle-anchor {
  346. position: absolute;
  347. left: 50%;
  348. top: 50%;
  349. }
  350. .compass-widget__tick {
  351. position: absolute;
  352. left: 50%;
  353. top: 50%;
  354. width: 2rpx;
  355. border-radius: 999rpx;
  356. transform: translate(-50%, -90rpx);
  357. background: rgba(28, 33, 28, 0.72);
  358. }
  359. .compass-widget__tick--short {
  360. height: 8rpx;
  361. }
  362. .compass-widget__tick--long {
  363. height: 12rpx;
  364. }
  365. .compass-widget__tick--major {
  366. width: 3rpx;
  367. height: 18rpx;
  368. background: rgba(18, 22, 18, 0.88);
  369. }
  370. .compass-widget__mark {
  371. position: absolute;
  372. left: 50%;
  373. top: 50%;
  374. line-height: 1;
  375. color: rgba(40, 42, 37, 0.88);
  376. text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.22);
  377. white-space: nowrap;
  378. transform-origin: center;
  379. }
  380. .compass-widget__mark--cardinal {
  381. font-size: 26rpx;
  382. font-weight: 700;
  383. }
  384. .compass-widget__mark--intermediate {
  385. font-size: 14rpx;
  386. font-weight: 600;
  387. }
  388. .compass-widget__mark--north {
  389. color: #d62323;
  390. }
  391. .compass-widget__mark--northeast,
  392. .compass-widget__mark--northwest {
  393. color: #577347;
  394. }
  395. .compass-widget__needle-anchor {
  396. width: 0;
  397. height: 0;
  398. }
  399. .compass-widget__needle-north,
  400. .compass-widget__needle-south {
  401. position: absolute;
  402. left: 50%;
  403. top: 50%;
  404. }
  405. .compass-widget__needle-north {
  406. width: 0;
  407. height: 0;
  408. border-left: 8rpx solid transparent;
  409. border-right: 8rpx solid transparent;
  410. border-bottom: 64rpx solid #ef2f2f;
  411. transform: translate(-50%, -74rpx);
  412. filter: drop-shadow(0 2rpx 3rpx rgba(96, 0, 0, 0.24));
  413. }
  414. .compass-widget__needle-south {
  415. width: 7rpx;
  416. height: 72rpx;
  417. border-radius: 999rpx;
  418. background: linear-gradient(180deg, rgba(236, 238, 232, 0.98) 0%, rgba(146, 151, 143, 0.98) 100%);
  419. transform: translate(-50%, 2rpx);
  420. box-shadow: 0 1rpx 3rpx rgba(32, 34, 31, 0.18);
  421. }
  422. .compass-widget__hub {
  423. position: absolute;
  424. left: 50%;
  425. top: 50%;
  426. width: 26rpx;
  427. height: 26rpx;
  428. transform: translate(-50%, -52%);
  429. border-radius: 50%;
  430. background: radial-gradient(circle at 34% 32%, #f4f3e7 0%, #d7d2bd 40%, #928b78 72%, #5a554b 100%);
  431. box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.32), 0 2rpx 5rpx rgba(0, 0, 0, 0.16);
  432. }
  433. .compass-widget__hub-core {
  434. position: absolute;
  435. left: 50%;
  436. top: 50%;
  437. width: 10rpx;
  438. height: 10rpx;
  439. transform: translate(-50%, -52%);
  440. border-radius: 50%;
  441. background: rgba(173, 170, 156, 0.92);
  442. box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.2);
  443. }
  444. .compass-widget__edge-arrow {
  445. width: 0;
  446. height: 0;
  447. margin-top: -2rpx;
  448. margin-bottom: -4rpx;
  449. border-left: 8rpx solid transparent;
  450. border-right: 8rpx solid transparent;
  451. border-top: 14rpx solid rgba(58, 49, 37, 0.72);
  452. filter: drop-shadow(0 1rpx 1rpx rgba(255, 255, 255, 0.18));
  453. }
  454. .compass-widget__hint {
  455. max-width: 196rpx;
  456. font-size: 14rpx;
  457. line-height: 1.3;
  458. color: #d62828;
  459. text-align: center;
  460. font-weight: 700;
  461. text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.24);
  462. }
  463. .race-panel-swiper {
  464. position: absolute;
  465. left: 0;
  466. right: 0;
  467. bottom: 0;
  468. height: 216rpx;
  469. z-index: 15;
  470. }
  471. .race-panel {
  472. position: relative;
  473. height: 100%;
  474. background: linear-gradient(180deg, #1d8fd2 0%, #197dba 100%);
  475. box-shadow: 0 -10rpx 24rpx rgba(18, 101, 150, 0.2);
  476. overflow: hidden;
  477. }
  478. .race-panel--tone-blue {
  479. background: linear-gradient(180deg, #1d8fd2 0%, #197dba 100%);
  480. box-shadow: 0 -10rpx 24rpx rgba(18, 101, 150, 0.22);
  481. }
  482. .race-panel--tone-purple {
  483. background: linear-gradient(180deg, #5317d4 0%, #4310b7 100%);
  484. box-shadow: 0 -10rpx 24rpx rgba(58, 16, 145, 0.24);
  485. }
  486. .race-panel--tone-green {
  487. background: linear-gradient(180deg, #08c805 0%, #05ab03 100%);
  488. box-shadow: 0 -10rpx 24rpx rgba(6, 112, 9, 0.24);
  489. }
  490. .race-panel--tone-yellow {
  491. background: linear-gradient(180deg, #ffbf1f 0%, #ffad0f 100%);
  492. box-shadow: 0 -10rpx 24rpx rgba(163, 105, 0, 0.24);
  493. }
  494. .race-panel--tone-yellow .race-panel__cell,
  495. .race-panel--tone-yellow .race-panel__tag,
  496. .race-panel--tone-orange .race-panel__tag,
  497. .race-panel--tone-red .race-panel__tag {
  498. color: #fff;
  499. }
  500. .race-panel--tone-orange {
  501. background: linear-gradient(180deg, #ff7b12 0%, #ff6500 100%);
  502. box-shadow: 0 -10rpx 24rpx rgba(156, 68, 0, 0.26);
  503. }
  504. .race-panel--tone-red {
  505. background: linear-gradient(180deg, #e1122c 0%, #c90e27 100%);
  506. box-shadow: 0 -10rpx 24rpx rgba(141, 16, 38, 0.28);
  507. }
  508. @keyframes app-edge-breathe-orange {
  509. 0%,
  510. 100% {
  511. box-shadow:
  512. inset 0 0 22rpx 6rpx rgba(255, 123, 18, 0.12),
  513. inset 0 0 54rpx 14rpx rgba(255, 148, 46, 0.06);
  514. }
  515. 50% {
  516. box-shadow:
  517. inset 0 0 34rpx 12rpx rgba(255, 133, 36, 0.24),
  518. inset 0 0 78rpx 24rpx rgba(255, 160, 78, 0.12);
  519. }
  520. }
  521. @keyframes app-edge-breathe-red {
  522. 0%,
  523. 100% {
  524. box-shadow:
  525. inset 0 0 24rpx 7rpx rgba(225, 18, 44, 0.14),
  526. inset 0 0 58rpx 16rpx rgba(233, 44, 67, 0.07);
  527. }
  528. 50% {
  529. box-shadow:
  530. inset 0 0 38rpx 14rpx rgba(233, 44, 67, 0.28),
  531. inset 0 0 86rpx 26rpx rgba(241, 82, 104, 0.14);
  532. }
  533. }
  534. .race-panel-pager {
  535. position: absolute;
  536. left: 50%;
  537. bottom: 18rpx;
  538. transform: translateX(-50%);
  539. display: flex;
  540. align-items: center;
  541. gap: 10rpx;
  542. z-index: 16;
  543. pointer-events: none;
  544. }
  545. .race-panel-pager__dot {
  546. width: 12rpx;
  547. height: 12rpx;
  548. border-radius: 50%;
  549. background: rgba(255, 255, 255, 0.35);
  550. box-shadow: 0 0 0 2rpx rgba(255, 255, 255, 0.08);
  551. }
  552. .race-panel-pager__dot--active {
  553. background: rgba(255, 255, 255, 0.92);
  554. box-shadow: 0 0 0 4rpx rgba(255, 255, 255, 0.12);
  555. }
  556. .race-panel__grid {
  557. position: relative;
  558. z-index: 2;
  559. display: grid;
  560. grid-template-columns: 1fr 1fr 1fr;
  561. grid-template-rows: 1fr 1fr;
  562. width: 100%;
  563. height: 100%;
  564. }
  565. .race-panel__cell {
  566. position: relative;
  567. display: flex;
  568. align-items: center;
  569. justify-content: center;
  570. color: #ffffff;
  571. box-sizing: border-box;
  572. }
  573. .race-panel__cell--action,
  574. .race-panel__cell--timer,
  575. .race-panel__cell--mileage {
  576. padding-top: 10rpx;
  577. }
  578. .race-panel__cell--distance,
  579. .race-panel__cell--progress,
  580. .race-panel__cell--speed {
  581. padding-top: 2rpx;
  582. }
  583. .race-panel__cell--action {
  584. justify-content: center;
  585. padding-left: 0;
  586. }
  587. .race-panel__cell--timer {
  588. padding-left: 0;
  589. padding-right: 0;
  590. }
  591. .race-panel__cell--mileage {
  592. justify-content: center;
  593. padding-right: 0;
  594. }
  595. .race-panel__cell--distance {
  596. justify-content: center;
  597. padding-left: 0;
  598. }
  599. .race-panel__cell--progress {
  600. padding-left: 0;
  601. padding-right: 0;
  602. }
  603. .race-panel__cell--speed {
  604. justify-content: center;
  605. padding-right: 0;
  606. }
  607. .race-panel__play {
  608. width: 0;
  609. height: 0;
  610. margin-left: 2rpx;
  611. border-top: 20rpx solid transparent;
  612. border-bottom: 20rpx solid transparent;
  613. border-left: 30rpx solid #ffffff;
  614. filter: drop-shadow(0 2rpx 0 rgba(255, 255, 255, 0.25));
  615. transform: translateX(16rpx);
  616. }
  617. .race-panel__timer {
  618. max-width: 100%;
  619. box-sizing: border-box;
  620. font-size: 50rpx;
  621. line-height: 1;
  622. letter-spacing: 2rpx;
  623. font-family: 'Courier New', monospace;
  624. text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.2);
  625. }
  626. .race-panel__mileage {
  627. max-width: 100%;
  628. box-sizing: border-box;
  629. font-size: 40rpx;
  630. line-height: 1;
  631. font-weight: 300;
  632. text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16);
  633. }
  634. .race-panel__mileage-wrap {
  635. display: flex;
  636. align-items: center;
  637. justify-content: center;
  638. gap: 10rpx;
  639. transform: translateX(-16rpx);
  640. }
  641. .race-panel__metric-group {
  642. max-width: 100%;
  643. box-sizing: border-box;
  644. display: flex;
  645. align-items: baseline;
  646. color: #ffffff;
  647. }
  648. .race-panel__metric-group--left {
  649. justify-content: center;
  650. transform: translateX(16rpx);
  651. }
  652. .race-panel__metric-group--right {
  653. justify-content: center;
  654. transform: translateX(-16rpx);
  655. }
  656. .race-panel__metric-value {
  657. line-height: 1;
  658. text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16);
  659. }
  660. .race-panel__metric-value--distance {
  661. font-size: 54rpx;
  662. font-weight: 700;
  663. }
  664. .race-panel__metric-value--speed {
  665. font-size: 48rpx;
  666. font-weight: 400;
  667. }
  668. .race-panel__metric-value--telemetry {
  669. font-size: 46rpx;
  670. font-weight: 600;
  671. }
  672. .race-panel__metric-value--telemetry-secondary {
  673. font-size: 42rpx;
  674. font-weight: 500;
  675. }
  676. .race-panel__metric-unit {
  677. line-height: 1;
  678. margin-left: 6rpx;
  679. opacity: 0.95;
  680. }
  681. .race-panel__metric-unit--distance {
  682. font-size: 24rpx;
  683. font-weight: 600;
  684. }
  685. .race-panel__metric-unit--speed {
  686. font-size: 18rpx;
  687. font-weight: 500;
  688. }
  689. .race-panel__metric-unit--telemetry {
  690. font-size: 18rpx;
  691. font-weight: 600;
  692. }
  693. .race-panel__progress {
  694. max-width: 100%;
  695. box-sizing: border-box;
  696. font-size: 50rpx;
  697. line-height: 1;
  698. font-weight: 400;
  699. text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16);
  700. }
  701. .race-panel__zone {
  702. display: flex;
  703. flex-direction: column;
  704. align-items: center;
  705. justify-content: center;
  706. gap: 6rpx;
  707. max-width: calc(100% - 12rpx);
  708. text-align: center;
  709. }
  710. .race-panel__zone-name {
  711. font-size: 32rpx;
  712. line-height: 1.08;
  713. font-weight: 700;
  714. color: #ffffff;
  715. text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.14);
  716. }
  717. .race-panel__zone-range {
  718. font-size: 20rpx;
  719. line-height: 1;
  720. color: rgba(255, 255, 255, 0.86);
  721. letter-spacing: 1rpx;
  722. }
  723. .race-panel__tag {
  724. position: absolute;
  725. z-index: 3;
  726. min-width: 56rpx;
  727. height: 32rpx;
  728. padding: 0 10rpx;
  729. background: #000000;
  730. color: #ffffff;
  731. font-size: 16rpx;
  732. line-height: 32rpx;
  733. text-align: center;
  734. letter-spacing: 2rpx;
  735. }
  736. .race-panel__tag--top-left {
  737. top: 0;
  738. left: 0;
  739. }
  740. .race-panel__tag--top-right {
  741. top: 0;
  742. right: 0;
  743. }
  744. .race-panel__tag--bottom-left {
  745. left: 0;
  746. bottom: 0;
  747. }
  748. .race-panel__tag--bottom-right {
  749. right: 0;
  750. bottom: 0;
  751. }
  752. .map-punch-button {
  753. position: absolute;
  754. right: 24rpx;
  755. bottom: 244rpx;
  756. width: 92rpx;
  757. height: 92rpx;
  758. border-radius: 50%;
  759. background: rgba(78, 92, 106, 0.82);
  760. box-shadow: 0 12rpx 28rpx rgba(22, 34, 46, 0.22), inset 0 0 0 2rpx rgba(255, 255, 255, 0.08);
  761. z-index: 18;
  762. }
  763. .map-punch-button__text {
  764. font-size: 20rpx;
  765. line-height: 92rpx;
  766. font-weight: 800;
  767. text-align: center;
  768. color: rgba(236, 241, 246, 0.88);
  769. }
  770. .map-punch-button--active {
  771. background: rgba(92, 255, 237, 0.96);
  772. box-shadow: 0 0 0 5rpx rgba(149, 255, 244, 0.18), 0 0 30rpx rgba(92, 255, 237, 0.5);
  773. animation: punch-button-ready 1s ease-in-out infinite;
  774. }
  775. .map-punch-button--active .map-punch-button__text {
  776. color: #064d46;
  777. }
  778. .map-punch-button--fx-ready-a,
  779. .map-punch-button--fx-ready-b {
  780. animation: punch-button-burst 0.92s ease-out 1;
  781. }
  782. .map-punch-button--fx-warning-a,
  783. .map-punch-button--fx-warning-b {
  784. animation: punch-button-warning 0.56s ease-in-out 1;
  785. }
  786. .race-panel__line {
  787. position: absolute;
  788. z-index: 1;
  789. height: 2rpx;
  790. box-shadow: 0 0 6rpx rgba(255, 255, 255, 0.2);
  791. }
  792. .race-panel__line--center {
  793. left: 33.3333%;
  794. right: 33.3333%;
  795. top: 50%;
  796. transform: translateY(-50%);
  797. background: rgba(255, 255, 255, 0.86);
  798. }
  799. .race-panel__line--left-mid {
  800. left: 0;
  801. width: 33.3333%;
  802. top: 50%;
  803. transform: translateY(-50%);
  804. background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.78) 100%);
  805. }
  806. .race-panel__line--right-mid {
  807. right: 0;
  808. width: 33.3333%;
  809. top: 50%;
  810. transform: translateY(-50%);
  811. background: linear-gradient(90deg, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.08) 100%);
  812. }
  813. .race-panel__line--left-top,
  814. .race-panel__line--left-bottom,
  815. .race-panel__line--right-top,
  816. .race-panel__line--right-bottom {
  817. width: 23%;
  818. top: 50%;
  819. }
  820. .race-panel__line--left-top {
  821. right: 66.6667%;
  822. transform-origin: right center;
  823. transform: translateY(-50%) rotate(70deg);
  824. background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.82) 100%);
  825. }
  826. .race-panel__line--left-bottom {
  827. right: 66.6667%;
  828. transform-origin: right center;
  829. transform: translateY(-50%) rotate(-70deg);
  830. background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.82) 100%);
  831. }
  832. .race-panel__line--right-top {
  833. left: 66.6667%;
  834. transform-origin: left center;
  835. transform: translateY(-50%) rotate(-70deg);
  836. background: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.08) 100%);
  837. }
  838. .race-panel__line--right-bottom {
  839. left: 66.6667%;
  840. transform-origin: left center;
  841. transform: translateY(-50%) rotate(70deg);
  842. background: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.08) 100%);
  843. }
  844. .race-panel__chevrons {
  845. position: relative;
  846. width: 24rpx;
  847. height: 24rpx;
  848. opacity: 0.5;
  849. flex-shrink: 0;
  850. }
  851. .race-panel__chevron {
  852. position: absolute;
  853. right: 6rpx;
  854. top: 50%;
  855. width: 10rpx;
  856. height: 10rpx;
  857. border-top: 3rpx solid rgba(255, 255, 255, 0.78);
  858. border-right: 3rpx solid rgba(255, 255, 255, 0.78);
  859. transform: translateY(-50%) rotate(45deg);
  860. }
  861. .race-panel__chevron--offset {
  862. right: 0;
  863. }
  864. .game-info-modal {
  865. position: absolute;
  866. inset: 0;
  867. display: flex;
  868. align-items: flex-end;
  869. justify-content: center;
  870. padding: 0 20rpx 28rpx;
  871. box-sizing: border-box;
  872. background: rgba(7, 18, 12, 0.34);
  873. z-index: 31;
  874. }
  875. .game-info-modal__dialog {
  876. width: 100%;
  877. max-height: 72vh;
  878. border-radius: 36rpx;
  879. background: rgba(248, 251, 244, 0.98);
  880. box-shadow: 0 20rpx 60rpx rgba(7, 18, 12, 0.24);
  881. overflow: hidden;
  882. }
  883. .game-info-modal__header {
  884. display: flex;
  885. align-items: center;
  886. justify-content: space-between;
  887. gap: 24rpx;
  888. padding: 22rpx 28rpx 18rpx;
  889. border-bottom: 1rpx solid rgba(22, 48, 32, 0.08);
  890. }
  891. .game-info-modal__header-main {
  892. flex: 1;
  893. min-width: 0;
  894. }
  895. .game-info-modal__header-actions {
  896. flex-shrink: 0;
  897. display: flex;
  898. align-items: center;
  899. justify-content: flex-end;
  900. }
  901. .game-info-modal__eyebrow {
  902. font-size: 22rpx;
  903. font-weight: 800;
  904. letter-spacing: 4rpx;
  905. color: #5f7a65;
  906. line-height: 1;
  907. }
  908. .game-info-modal__title {
  909. margin-top: 12rpx;
  910. font-size: 42rpx;
  911. line-height: 1.08;
  912. font-weight: 700;
  913. color: #163020;
  914. }
  915. .game-info-modal__subtitle {
  916. margin-top: 10rpx;
  917. font-size: 22rpx;
  918. line-height: 1.3;
  919. color: #5f7a65;
  920. }
  921. .game-info-modal__close {
  922. flex-shrink: 0;
  923. min-width: 108rpx;
  924. padding: 14rpx 22rpx;
  925. border-radius: 999rpx;
  926. background: #163020;
  927. color: #f7fbf2;
  928. font-size: 24rpx;
  929. text-align: center;
  930. }
  931. .game-info-modal__content {
  932. max-height: calc(72vh - 132rpx);
  933. padding: 12rpx 24rpx 30rpx;
  934. box-sizing: border-box;
  935. }
  936. .debug-section--info {
  937. margin-top: 14rpx;
  938. }
  939. .debug-modal {
  940. position: absolute;
  941. inset: 0;
  942. display: flex;
  943. align-items: flex-end;
  944. justify-content: center;
  945. padding: 0 20rpx 28rpx;
  946. box-sizing: border-box;
  947. background: rgba(7, 18, 12, 0.34);
  948. z-index: 30;
  949. }
  950. .debug-modal__dialog {
  951. width: 100%;
  952. max-height: 72vh;
  953. border-radius: 36rpx;
  954. background: rgba(248, 251, 244, 0.98);
  955. box-shadow: 0 20rpx 60rpx rgba(7, 18, 12, 0.24);
  956. overflow: hidden;
  957. }
  958. .debug-modal__header {
  959. display: flex;
  960. align-items: center;
  961. justify-content: space-between;
  962. gap: 24rpx;
  963. padding: 22rpx 28rpx 18rpx;
  964. border-bottom: 1rpx solid rgba(22, 48, 32, 0.08);
  965. }
  966. .debug-modal__header-main {
  967. flex: 1;
  968. min-width: 0;
  969. }
  970. .debug-modal__header-actions {
  971. flex-shrink: 0;
  972. display: flex;
  973. align-items: center;
  974. justify-content: flex-end;
  975. }
  976. .debug-modal__eyebrow {
  977. font-size: 22rpx;
  978. font-weight: 800;
  979. letter-spacing: 4rpx;
  980. color: #5f7a65;
  981. line-height: 1;
  982. flex-shrink: 0;
  983. }
  984. .debug-modal__build {
  985. margin-top: 10rpx;
  986. display: inline-flex;
  987. padding: 8rpx 14rpx;
  988. border-radius: 999rpx;
  989. background: rgba(22, 48, 32, 0.08);
  990. color: #45624b;
  991. font-size: 20rpx;
  992. line-height: 1;
  993. letter-spacing: 1rpx;
  994. flex-shrink: 0;
  995. }
  996. .debug-modal__close {
  997. flex-shrink: 0;
  998. min-width: 108rpx;
  999. padding: 14rpx 22rpx;
  1000. border-radius: 999rpx;
  1001. background: #163020;
  1002. color: #f7fbf2;
  1003. font-size: 24rpx;
  1004. text-align: center;
  1005. }
  1006. .debug-modal__content {
  1007. max-height: calc(72vh - 108rpx);
  1008. padding: 12rpx 24rpx 30rpx;
  1009. box-sizing: border-box;
  1010. }
  1011. .debug-section {
  1012. margin-top: 16rpx;
  1013. padding: 18rpx 20rpx 22rpx;
  1014. border-radius: 24rpx;
  1015. background: rgba(242, 247, 239, 0.98);
  1016. box-shadow: inset 0 0 0 1rpx rgba(22, 48, 32, 0.05);
  1017. }
  1018. .debug-section:first-child {
  1019. margin-top: 0;
  1020. }
  1021. .debug-section__header {
  1022. margin-bottom: 12rpx;
  1023. }
  1024. .debug-section__title {
  1025. font-size: 24rpx;
  1026. line-height: 1.2;
  1027. font-weight: 800;
  1028. letter-spacing: 2rpx;
  1029. color: #163020;
  1030. text-transform: uppercase;
  1031. }
  1032. .debug-section__desc {
  1033. margin-top: 6rpx;
  1034. font-size: 20rpx;
  1035. line-height: 1.45;
  1036. color: #6a826f;
  1037. }
  1038. .info-panel__row {
  1039. display: flex;
  1040. align-items: flex-start;
  1041. justify-content: space-between;
  1042. gap: 24rpx;
  1043. padding: 10rpx 0;
  1044. border-bottom: 1rpx solid rgba(22, 48, 32, 0.08);
  1045. }
  1046. .info-panel__row--stack {
  1047. align-items: flex-start;
  1048. }
  1049. .info-panel__row:last-of-type {
  1050. border-bottom: none;
  1051. }
  1052. .info-panel__label {
  1053. width: 148rpx;
  1054. flex-shrink: 0;
  1055. font-size: 22rpx;
  1056. letter-spacing: 2rpx;
  1057. color: #5f7a65;
  1058. text-align: left;
  1059. text-transform: uppercase;
  1060. }
  1061. .info-panel__value {
  1062. flex: 1;
  1063. min-width: 0;
  1064. font-size: 25rpx;
  1065. line-height: 1.45;
  1066. color: #163020;
  1067. text-align: right;
  1068. word-break: break-all;
  1069. }
  1070. .info-panel__row--stack .info-panel__value {
  1071. margin-top: 0;
  1072. text-align: right;
  1073. color: #45624b;
  1074. }
  1075. .debug-input {
  1076. flex: 1;
  1077. min-height: 72rpx;
  1078. padding: 0 22rpx;
  1079. border-radius: 18rpx;
  1080. background: rgba(255, 255, 255, 0.92);
  1081. box-shadow: inset 0 0 0 2rpx rgba(22, 48, 32, 0.08);
  1082. font-size: 24rpx;
  1083. color: #244132;
  1084. text-align: left;
  1085. }
  1086. .debug-inline-stack {
  1087. flex: 1;
  1088. display: flex;
  1089. flex-direction: column;
  1090. gap: 14rpx;
  1091. }
  1092. .debug-device-list {
  1093. display: flex;
  1094. flex-direction: column;
  1095. gap: 12rpx;
  1096. margin-top: 16rpx;
  1097. }
  1098. .debug-device-card {
  1099. display: flex;
  1100. align-items: center;
  1101. justify-content: space-between;
  1102. gap: 16rpx;
  1103. padding: 16rpx 18rpx;
  1104. border-radius: 18rpx;
  1105. background: rgba(255, 255, 255, 0.82);
  1106. box-shadow: inset 0 0 0 2rpx rgba(22, 48, 32, 0.06);
  1107. }
  1108. .debug-device-card__main {
  1109. flex: 1;
  1110. min-width: 0;
  1111. }
  1112. .debug-device-card__title-row {
  1113. display: flex;
  1114. align-items: center;
  1115. gap: 10rpx;
  1116. }
  1117. .debug-device-card__name {
  1118. flex: 1;
  1119. min-width: 0;
  1120. font-size: 24rpx;
  1121. line-height: 1.3;
  1122. font-weight: 700;
  1123. color: #163020;
  1124. word-break: break-all;
  1125. }
  1126. .debug-device-card__badge {
  1127. flex-shrink: 0;
  1128. padding: 4rpx 10rpx;
  1129. border-radius: 999rpx;
  1130. background: rgba(45, 106, 79, 0.14);
  1131. color: #2d6a4f;
  1132. font-size: 18rpx;
  1133. line-height: 1;
  1134. font-weight: 700;
  1135. }
  1136. .debug-device-card__meta {
  1137. margin-top: 8rpx;
  1138. font-size: 20rpx;
  1139. line-height: 1.2;
  1140. color: #6a826f;
  1141. }
  1142. .debug-device-card__action {
  1143. flex-shrink: 0;
  1144. min-width: 96rpx;
  1145. padding: 16rpx 18rpx;
  1146. border-radius: 999rpx;
  1147. background: #eef6ea;
  1148. color: #2d6a4f;
  1149. font-size: 22rpx;
  1150. line-height: 1;
  1151. text-align: center;
  1152. font-weight: 700;
  1153. }
  1154. .debug-device-card__action--active {
  1155. background: #2d6a4f;
  1156. color: #f7fbf2;
  1157. }
  1158. .control-row {
  1159. display: flex;
  1160. gap: 14rpx;
  1161. margin-top: 18rpx;
  1162. }
  1163. .control-row--compact {
  1164. margin-top: 0;
  1165. }
  1166. .control-row--compact .control-chip {
  1167. padding: 16rpx 10rpx;
  1168. font-size: 22rpx;
  1169. }
  1170. .control-row--single .control-chip {
  1171. flex: none;
  1172. width: 100%;
  1173. }
  1174. .debug-section .control-row:last-child {
  1175. margin-bottom: 0;
  1176. }
  1177. .control-row--triple .control-chip {
  1178. font-size: 23rpx;
  1179. }
  1180. .control-chip {
  1181. flex: 1;
  1182. min-width: 0;
  1183. padding: 20rpx 16rpx;
  1184. border-radius: 999rpx;
  1185. background: #d7e8da;
  1186. color: #163020;
  1187. font-size: 26rpx;
  1188. text-align: center;
  1189. box-sizing: border-box;
  1190. }
  1191. .control-chip--primary {
  1192. background: #2d6a4f;
  1193. color: #f7fbf2;
  1194. }
  1195. .control-chip--secondary {
  1196. background: #eef6ea;
  1197. color: #45624b;
  1198. }
  1199. .control-chip--active {
  1200. background: #2d6a4f;
  1201. color: #f7fbf2;
  1202. }
  1203. .race-panel__cell--action {
  1204. justify-content: flex-start;
  1205. padding-left: 44rpx;
  1206. }
  1207. .race-panel__cell--timer {
  1208. padding-left: 12rpx;
  1209. padding-right: 12rpx;
  1210. }
  1211. .race-panel__cell--mileage {
  1212. justify-content: flex-end;
  1213. padding-right: 56rpx;
  1214. }
  1215. .race-panel__cell--distance {
  1216. justify-content: flex-start;
  1217. padding-left: 28rpx;
  1218. }
  1219. .race-panel__cell--progress {
  1220. padding-left: 8rpx;
  1221. padding-right: 8rpx;
  1222. }
  1223. .race-panel__cell--speed {
  1224. justify-content: flex-end;
  1225. padding-right: 32rpx;
  1226. }
  1227. .race-panel__timer,
  1228. .race-panel__progress,
  1229. .race-panel__mileage,
  1230. .race-panel__metric-group {
  1231. max-width: 100%;
  1232. box-sizing: border-box;
  1233. }
  1234. .race-panel__metric-group--panel {
  1235. max-width: calc(100% - 8rpx);
  1236. }
  1237. .game-punch-hint {
  1238. position: absolute;
  1239. left: 50%;
  1240. bottom: 280rpx;
  1241. transform: translateX(-50%);
  1242. max-width: 72vw;
  1243. padding: 14rpx 24rpx;
  1244. border-radius: 999rpx;
  1245. background: rgba(18, 33, 24, 0.78);
  1246. color: #f7fbf2;
  1247. font-size: 24rpx;
  1248. line-height: 1.2;
  1249. text-align: center;
  1250. z-index: 16;
  1251. pointer-events: none;
  1252. }
  1253. .game-punch-feedback {
  1254. position: absolute;
  1255. left: 50%;
  1256. top: 18%;
  1257. transform: translateX(-50%);
  1258. min-width: 240rpx;
  1259. padding: 20rpx 28rpx;
  1260. border-radius: 24rpx;
  1261. color: #ffffff;
  1262. font-size: 24rpx;
  1263. font-weight: 700;
  1264. text-align: center;
  1265. box-shadow: 0 16rpx 36rpx rgba(0, 0, 0, 0.18);
  1266. z-index: 17;
  1267. pointer-events: none;
  1268. }
  1269. .game-punch-feedback--neutral {
  1270. background: rgba(27, 109, 189, 0.92);
  1271. }
  1272. .game-punch-feedback--success {
  1273. background: rgba(37, 134, 88, 0.94);
  1274. }
  1275. .game-punch-feedback--warning {
  1276. background: rgba(196, 117, 18, 0.94);
  1277. }
  1278. .game-punch-feedback--fx-pop {
  1279. animation: feedback-toast-pop 0.42s ease-out;
  1280. }
  1281. .game-punch-feedback--fx-success {
  1282. animation: feedback-toast-success 0.58s ease-out;
  1283. }
  1284. .game-punch-feedback--fx-warning {
  1285. animation: feedback-toast-warning 0.56s ease-out;
  1286. }
  1287. .game-content-card {
  1288. position: absolute;
  1289. left: 50%;
  1290. top: 26%;
  1291. width: 440rpx;
  1292. max-width: calc(100vw - 72rpx);
  1293. transform: translateX(-50%);
  1294. padding: 28rpx 28rpx 24rpx;
  1295. border-radius: 28rpx;
  1296. background: rgba(248, 251, 244, 0.96);
  1297. box-shadow: 0 18rpx 48rpx rgba(22, 48, 32, 0.18);
  1298. box-sizing: border-box;
  1299. z-index: 17;
  1300. }
  1301. .game-content-card__title {
  1302. font-size: 34rpx;
  1303. line-height: 1.2;
  1304. font-weight: 700;
  1305. color: #163020;
  1306. }
  1307. .game-content-card__body {
  1308. margin-top: 12rpx;
  1309. font-size: 24rpx;
  1310. line-height: 1.5;
  1311. color: #45624b;
  1312. }
  1313. .game-content-card__hint {
  1314. margin-top: 16rpx;
  1315. font-size: 20rpx;
  1316. color: #809284;
  1317. }
  1318. .game-content-card--fx-pop {
  1319. animation: content-card-pop 0.5s cubic-bezier(0.18, 0.88, 0.2, 1);
  1320. }
  1321. .game-content-card--fx-finish {
  1322. animation: content-card-finish 0.68s cubic-bezier(0.18, 0.88, 0.2, 1);
  1323. }
  1324. .race-panel__action-button {
  1325. display: flex;
  1326. align-items: center;
  1327. justify-content: center;
  1328. min-width: 116rpx;
  1329. min-height: 72rpx;
  1330. padding: 0 20rpx;
  1331. border-radius: 999rpx;
  1332. background: rgba(78, 92, 106, 0.54);
  1333. border: 2rpx solid rgba(210, 220, 228, 0.18);
  1334. box-sizing: border-box;
  1335. box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.06);
  1336. }
  1337. .race-panel__action-button--active {
  1338. background: rgba(255, 226, 88, 0.98);
  1339. border-color: rgba(255, 247, 194, 0.98);
  1340. box-shadow: 0 0 0 4rpx rgba(255, 241, 158, 0.18), 0 0 28rpx rgba(255, 239, 122, 0.42);
  1341. animation: punch-button-ready 1s ease-in-out infinite;
  1342. }
  1343. .race-panel__action-button-text {
  1344. font-size: 24rpx;
  1345. line-height: 1;
  1346. font-weight: 700;
  1347. color: rgba(236, 241, 246, 0.86);
  1348. }
  1349. .race-panel__action-button--active .race-panel__action-button-text {
  1350. color: #775000;
  1351. }
  1352. @keyframes punch-button-ready {
  1353. 0% {
  1354. transform: scale(1);
  1355. box-shadow: 0 0 0 0 rgba(255, 241, 158, 0.22), 0 0 18rpx rgba(255, 239, 122, 0.28);
  1356. }
  1357. 50% {
  1358. transform: scale(1.06);
  1359. box-shadow: 0 0 0 8rpx rgba(255, 241, 158, 0.08), 0 0 34rpx rgba(255, 239, 122, 0.52);
  1360. }
  1361. 100% {
  1362. transform: scale(1);
  1363. box-shadow: 0 0 0 0 rgba(255, 241, 158, 0.22), 0 0 18rpx rgba(255, 239, 122, 0.28);
  1364. }
  1365. }
  1366. @keyframes punch-button-burst {
  1367. 0% {
  1368. transform: scale(1);
  1369. box-shadow: 0 12rpx 28rpx rgba(22, 34, 46, 0.22);
  1370. }
  1371. 34% {
  1372. transform: scale(1.12);
  1373. box-shadow: 0 0 0 9rpx rgba(149, 255, 244, 0.18), 0 0 34rpx rgba(92, 255, 237, 0.58);
  1374. }
  1375. 100% {
  1376. transform: scale(1);
  1377. box-shadow: 0 12rpx 28rpx rgba(22, 34, 46, 0.22);
  1378. }
  1379. }
  1380. @keyframes punch-button-warning {
  1381. 0%, 100% {
  1382. transform: translateX(0);
  1383. }
  1384. 20% {
  1385. transform: translateX(-6rpx) scale(1.02);
  1386. }
  1387. 40% {
  1388. transform: translateX(6rpx) scale(1.04);
  1389. }
  1390. 60% {
  1391. transform: translateX(-4rpx) scale(1.02);
  1392. }
  1393. 80% {
  1394. transform: translateX(4rpx);
  1395. }
  1396. }
  1397. @keyframes feedback-toast-pop {
  1398. 0% {
  1399. opacity: 0;
  1400. transform: translateX(-50%) translateY(18rpx) scale(0.88);
  1401. }
  1402. 100% {
  1403. opacity: 1;
  1404. transform: translateX(-50%) translateY(0) scale(1);
  1405. }
  1406. }
  1407. @keyframes feedback-toast-success {
  1408. 0% {
  1409. opacity: 0;
  1410. transform: translateX(-50%) translateY(18rpx) scale(0.88);
  1411. }
  1412. 55% {
  1413. opacity: 1;
  1414. transform: translateX(-50%) translateY(-6rpx) scale(1.04);
  1415. }
  1416. 100% {
  1417. opacity: 1;
  1418. transform: translateX(-50%) translateY(0) scale(1);
  1419. }
  1420. }
  1421. @keyframes feedback-toast-warning {
  1422. 0% {
  1423. opacity: 0;
  1424. transform: translateX(-50%) translateY(12rpx) scale(0.92);
  1425. }
  1426. 30% {
  1427. opacity: 1;
  1428. transform: translateX(calc(-50% - 6rpx)) translateY(0) scale(1.02);
  1429. }
  1430. 60% {
  1431. transform: translateX(calc(-50% + 6rpx)) translateY(0) scale(1.02);
  1432. }
  1433. 100% {
  1434. opacity: 1;
  1435. transform: translateX(-50%) translateY(0) scale(1);
  1436. }
  1437. }
  1438. @keyframes content-card-pop {
  1439. 0% {
  1440. opacity: 0;
  1441. transform: translateX(-50%) translateY(30rpx) scale(0.92);
  1442. }
  1443. 100% {
  1444. opacity: 1;
  1445. transform: translateX(-50%) translateY(0) scale(1);
  1446. }
  1447. }
  1448. @keyframes content-card-finish {
  1449. 0% {
  1450. opacity: 0;
  1451. transform: translateX(-50%) translateY(34rpx) scale(0.9);
  1452. box-shadow: 0 18rpx 48rpx rgba(22, 48, 32, 0.18);
  1453. }
  1454. 45% {
  1455. opacity: 1;
  1456. transform: translateX(-50%) translateY(-6rpx) scale(1.03);
  1457. box-shadow: 0 0 0 6rpx rgba(255, 232, 147, 0.18), 0 22rpx 52rpx rgba(22, 48, 32, 0.2);
  1458. }
  1459. 100% {
  1460. opacity: 1;
  1461. transform: translateX(-50%) translateY(0) scale(1);
  1462. box-shadow: 0 18rpx 48rpx rgba(22, 48, 32, 0.18);
  1463. }
  1464. }
  1465. @keyframes map-pulse-control {
  1466. 0% {
  1467. opacity: 0.94;
  1468. transform: scale(0.28);
  1469. border: 6rpx solid rgba(92, 255, 237, 0.98);
  1470. box-shadow: 0 0 0 0 rgba(92, 255, 237, 0.42);
  1471. }
  1472. 70% {
  1473. opacity: 0.32;
  1474. transform: scale(3.4);
  1475. border: 4rpx solid rgba(92, 255, 237, 0.52);
  1476. box-shadow: 0 0 0 10rpx rgba(92, 255, 237, 0.08);
  1477. }
  1478. 100% {
  1479. opacity: 0;
  1480. transform: scale(4.1);
  1481. border: 2rpx solid rgba(92, 255, 237, 0);
  1482. box-shadow: 0 0 0 0 rgba(92, 255, 237, 0);
  1483. }
  1484. }
  1485. @keyframes map-pulse-ready {
  1486. 0% {
  1487. opacity: 0.92;
  1488. transform: scale(0.22);
  1489. border: 5rpx solid rgba(255, 248, 184, 0.98);
  1490. box-shadow: 0 0 0 0 rgba(255, 248, 184, 0.28);
  1491. }
  1492. 68% {
  1493. opacity: 0.22;
  1494. transform: scale(2.4);
  1495. border: 3rpx solid rgba(255, 248, 184, 0.46);
  1496. box-shadow: 0 0 0 8rpx rgba(255, 248, 184, 0.08);
  1497. }
  1498. 100% {
  1499. opacity: 0;
  1500. transform: scale(3);
  1501. border: 2rpx solid rgba(255, 248, 184, 0);
  1502. box-shadow: 0 0 0 0 rgba(255, 248, 184, 0);
  1503. }
  1504. }
  1505. @keyframes map-pulse-finish {
  1506. 0% {
  1507. opacity: 0.98;
  1508. transform: scale(0.24);
  1509. border: 6rpx solid rgba(255, 231, 117, 1);
  1510. box-shadow: 0 0 0 0 rgba(255, 231, 117, 0.46);
  1511. }
  1512. 48% {
  1513. opacity: 0.52;
  1514. transform: scale(3.8);
  1515. border: 4rpx solid rgba(255, 231, 117, 0.72);
  1516. box-shadow: 0 0 0 14rpx rgba(255, 231, 117, 0.14);
  1517. }
  1518. 100% {
  1519. opacity: 0;
  1520. transform: scale(4.8);
  1521. border: 2rpx solid rgba(255, 231, 117, 0);
  1522. box-shadow: 0 0 0 0 rgba(255, 231, 117, 0);
  1523. }
  1524. }
  1525. @keyframes stage-fx-finish {
  1526. 0% {
  1527. opacity: 0;
  1528. background: radial-gradient(circle at 50% 50%, rgba(255, 241, 168, 0.22) 0%, rgba(255, 241, 168, 0.08) 28%, rgba(255, 255, 255, 0) 62%);
  1529. backdrop-filter: brightness(1);
  1530. }
  1531. 24% {
  1532. opacity: 1;
  1533. background: radial-gradient(circle at 50% 50%, rgba(255, 241, 168, 0.34) 0%, rgba(255, 241, 168, 0.14) 32%, rgba(255, 255, 255, 0.04) 74%);
  1534. backdrop-filter: brightness(1.08);
  1535. }
  1536. 100% {
  1537. opacity: 0;
  1538. background: radial-gradient(circle at 50% 50%, rgba(255, 241, 168, 0) 0%, rgba(255, 241, 168, 0) 100%);
  1539. backdrop-filter: brightness(1);
  1540. }
  1541. }