map.wxss 31 KB

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