map.wxss 42 KB

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