map.wxss 35 KB

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