.page { height: 100vh; position: relative; overflow: hidden; background: #dbeed4; color: #163020; } .map-stage { position: absolute; inset: 0; overflow: hidden; background: #dbeed4; } .map-content { position: absolute; inset: 0; } .map-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; } .map-canvas--base { z-index: 1; } .map-canvas--labels { z-index: 2; pointer-events: none; } .map-stage__crosshair { position: absolute; left: 50%; top: 50%; width: 44rpx; height: 44rpx; transform: translate(-50%, -50%); border: 3rpx solid rgba(255, 255, 255, 0.95); border-radius: 50%; box-shadow: 0 0 0 4rpx rgba(22, 48, 32, 0.2); pointer-events: none; z-index: 3; } .map-stage__crosshair::before, .map-stage__crosshair::after { content: ''; position: absolute; background: rgba(255, 255, 255, 0.95); } .map-stage__crosshair::before { left: 50%; top: -18rpx; width: 2rpx; height: 76rpx; transform: translateX(-50%); } .map-stage__crosshair::after { left: -18rpx; top: 50%; width: 76rpx; height: 2rpx; transform: translateY(-50%); } .map-stage__overlay { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: flex-end; padding: 0 24rpx 248rpx; box-sizing: border-box; pointer-events: none; z-index: 4; } .map-stage__topbar { display: flex; align-items: flex-start; justify-content: flex-start; } .map-stage__meta { max-width: 68%; padding: 18rpx 20rpx 20rpx; border-radius: 28rpx; background: rgba(248, 251, 244, 0.92); box-shadow: 0 14rpx 36rpx rgba(22, 48, 32, 0.12); backdrop-filter: blur(12rpx); } .map-stage__eyebrow { font-size: 20rpx; letter-spacing: 4rpx; color: #5f7a65; } .map-stage__title { margin-top: 8rpx; font-size: 38rpx; font-weight: 600; } .map-stage__badge { display: inline-flex; margin-top: 14rpx; padding: 8rpx 18rpx; border-radius: 999rpx; background: rgba(22, 48, 32, 0.9); color: #f7fbf2; font-size: 22rpx; } .screen-button-layer { position: absolute; width: 116rpx; min-height: 116rpx; padding: 18rpx 0 14rpx; border-radius: 30rpx; background: rgba(248, 251, 244, 0.96); box-shadow: 0 14rpx 36rpx rgba(22, 48, 32, 0.14); display: flex; flex-direction: column; align-items: center; justify-content: center; box-sizing: border-box; z-index: 20; } .screen-button-layer__icon { position: relative; width: 54rpx; height: 32rpx; margin: 0 auto; border: 4rpx solid #163020; border-radius: 8rpx; box-sizing: border-box; } .screen-button-layer__line { position: absolute; left: 8rpx; right: 8rpx; bottom: 6rpx; height: 4rpx; border-radius: 999rpx; background: rgba(22, 48, 32, 0.3); } .screen-button-layer__stand { position: absolute; left: 50%; bottom: -12rpx; width: 18rpx; height: 4rpx; margin-left: -9rpx; border-radius: 999rpx; background: #163020; } .screen-button-layer__text { margin-top: 18rpx; text-align: center; font-size: 22rpx; font-weight: 600; color: #163020; line-height: 1.2; } .map-stage__bottom { display: flex; align-items: flex-end; justify-content: center; width: 100%; } .screen-button-layer--bottom-left { left: 24rpx; bottom: 244rpx; } .screen-button-layer--start-left { left: 24rpx; bottom: 378rpx; min-height: 96rpx; padding: 0 18rpx; background: rgba(255, 226, 88, 0.96); box-shadow: 0 14rpx 36rpx rgba(120, 89, 0, 0.2), 0 0 0 3rpx rgba(255, 246, 186, 0.38); } .screen-button-layer__text--start { margin-top: 0; font-size: 30rpx; font-weight: 800; color: #6d4b00; letter-spacing: 2rpx; } .map-side-toggle { position: absolute; left: 24rpx; z-index: 19; } .map-side-column { position: absolute; display: flex; flex-direction: column; gap: 16rpx; padding-top: 12rpx; z-index: 18; } .map-side-column--left { left: 24rpx; } .map-side-column--left-group { padding-top: 106rpx; } .map-side-column--right-main { right: 118rpx; } .map-side-column--right-sub { right: 24rpx; } .map-side-button { width: 78rpx; height: 78rpx; border-radius: 22rpx; background: rgba(248, 251, 244, 0.96); box-shadow: 0 10rpx 26rpx rgba(22, 48, 32, 0.14); display: flex; align-items: center; justify-content: center; box-sizing: border-box; } .map-side-button--icon { width: 90rpx; height: 90rpx; padding: 0; background: transparent; box-shadow: none; border-radius: 0; } .map-side-button__image { width: 100%; height: 100%; } .map-side-button__rotate-image { width: 100%; height: 100%; border-radius: 16rpx; box-sizing: border-box; } .map-side-button__rotate-image--active { border: 1px solid rgba(231, 54, 33, 0.98); } .map-side-button--muted { background: rgba(229, 233, 230, 0.92); } .map-side-button__text { font-size: 18rpx; line-height: 1.1; font-weight: 700; color: #163020; text-align: center; letter-spacing: 1rpx; } .compass-widget { display: flex; flex-direction: column; align-items: center; gap: 6rpx; flex-shrink: 0; } .compass-widget__heading { font-size: 14rpx; line-height: 1; font-weight: 600; color: rgba(32, 42, 34, 0.72); text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.35); } .compass-widget__dial { position: relative; width: 196rpx; height: 196rpx; border-radius: 50%; 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%); border: 2rpx solid rgba(18, 24, 18, 0.48); box-shadow: 0 6rpx 14rpx rgba(0, 0, 0, 0.14), inset 0 0 0 2rpx rgba(255, 255, 255, 0.24); overflow: hidden; } .compass-widget__dial--active { border-color: rgba(250, 252, 187, 0.98); 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); } .compass-widget__glass, .compass-widget__inner-shadow { position: absolute; inset: 0; border-radius: 50%; pointer-events: none; } .compass-widget__glass { 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%); } .compass-widget__inner-shadow { box-shadow: inset 0 0 0 12rpx rgba(0, 0, 0, 0.07), inset 0 0 18rpx rgba(255, 255, 255, 0.22); } .compass-widget__card { position: absolute; inset: 0; transform-origin: center; } .compass-widget__north-arrow { position: absolute; left: 50%; top: 50%; width: 54rpx; height: 176rpx; transform: translate(-50%, -52%); display: block; pointer-events: none; z-index: 1; opacity: 0.42; } .compass-widget__north-arrow-outline, .compass-widget__north-arrow-fill, .compass-widget__north-arrow-tail-outline, .compass-widget__north-arrow-tail-fill { display: none; } .compass-widget__tick-anchor, .compass-widget__mark-anchor, .compass-widget__needle-anchor { position: absolute; left: 50%; top: 50%; } .compass-widget__tick { position: absolute; left: 50%; top: 50%; width: 2rpx; border-radius: 999rpx; transform: translate(-50%, -90rpx); background: rgba(28, 33, 28, 0.72); } .compass-widget__tick--short { height: 8rpx; } .compass-widget__tick--long { height: 12rpx; } .compass-widget__tick--major { width: 3rpx; height: 18rpx; background: rgba(18, 22, 18, 0.88); } .compass-widget__mark { position: absolute; left: 50%; top: 50%; line-height: 1; color: rgba(40, 42, 37, 0.88); text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.22); white-space: nowrap; transform-origin: center; } .compass-widget__mark--cardinal { font-size: 26rpx; font-weight: 700; } .compass-widget__mark--intermediate { font-size: 14rpx; font-weight: 600; } .compass-widget__mark--north { color: #d62323; } .compass-widget__mark--northeast, .compass-widget__mark--northwest { color: #577347; } .compass-widget__needle-anchor { width: 0; height: 0; } .compass-widget__needle-north, .compass-widget__needle-south { position: absolute; left: 50%; top: 50%; } .compass-widget__needle-north { width: 0; height: 0; border-left: 8rpx solid transparent; border-right: 8rpx solid transparent; border-bottom: 64rpx solid #ef2f2f; transform: translate(-50%, -74rpx); filter: drop-shadow(0 2rpx 3rpx rgba(96, 0, 0, 0.24)); } .compass-widget__needle-south { width: 7rpx; height: 72rpx; border-radius: 999rpx; background: linear-gradient(180deg, rgba(236, 238, 232, 0.98) 0%, rgba(146, 151, 143, 0.98) 100%); transform: translate(-50%, 2rpx); box-shadow: 0 1rpx 3rpx rgba(32, 34, 31, 0.18); } .compass-widget__hub { position: absolute; left: 50%; top: 50%; width: 26rpx; height: 26rpx; transform: translate(-50%, -52%); border-radius: 50%; background: radial-gradient(circle at 34% 32%, #f4f3e7 0%, #d7d2bd 40%, #928b78 72%, #5a554b 100%); box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.32), 0 2rpx 5rpx rgba(0, 0, 0, 0.16); } .compass-widget__hub-core { position: absolute; left: 50%; top: 50%; width: 10rpx; height: 10rpx; transform: translate(-50%, -52%); border-radius: 50%; background: rgba(173, 170, 156, 0.92); box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.2); } .compass-widget__edge-arrow { width: 0; height: 0; margin-top: -2rpx; margin-bottom: -4rpx; border-left: 8rpx solid transparent; border-right: 8rpx solid transparent; border-top: 14rpx solid rgba(58, 49, 37, 0.72); filter: drop-shadow(0 1rpx 1rpx rgba(255, 255, 255, 0.18)); } .compass-widget__hint { max-width: 196rpx; font-size: 14rpx; line-height: 1.3; color: #d62828; text-align: center; font-weight: 700; text-shadow: 0 1rpx 0 rgba(255, 255, 255, 0.24); } .race-panel { position: absolute; left: 0; right: 0; bottom: 0; height: 216rpx; background: linear-gradient(180deg, #1d97ec 0%, #168ce4 100%); box-shadow: 0 -10rpx 24rpx rgba(10, 75, 125, 0.2); z-index: 15; overflow: hidden; } .race-panel__grid { position: relative; z-index: 2; display: grid; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr; width: 100%; height: 100%; } .race-panel__cell { position: relative; display: flex; align-items: center; justify-content: center; color: #ffffff; box-sizing: border-box; } .race-panel__cell--action, .race-panel__cell--timer, .race-panel__cell--mileage { padding-top: 10rpx; } .race-panel__cell--distance, .race-panel__cell--progress, .race-panel__cell--speed { padding-top: 2rpx; } .race-panel__cell--action { justify-content: center; padding-left: 0; } .race-panel__cell--timer { padding-left: 0; padding-right: 0; } .race-panel__cell--mileage { justify-content: center; padding-right: 0; } .race-panel__cell--distance { justify-content: center; padding-left: 0; } .race-panel__cell--progress { padding-left: 0; padding-right: 0; } .race-panel__cell--speed { justify-content: center; padding-right: 0; } .race-panel__play { width: 0; height: 0; margin-left: 2rpx; border-top: 20rpx solid transparent; border-bottom: 20rpx solid transparent; border-left: 30rpx solid #ffffff; filter: drop-shadow(0 2rpx 0 rgba(255, 255, 255, 0.25)); transform: translateX(16rpx); } .race-panel__timer { max-width: 100%; box-sizing: border-box; font-size: 50rpx; line-height: 1; letter-spacing: 2rpx; font-family: 'Courier New', monospace; text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.2); } .race-panel__mileage { max-width: 100%; box-sizing: border-box; font-size: 40rpx; line-height: 1; font-weight: 300; text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16); } .race-panel__mileage-wrap { display: flex; align-items: center; justify-content: center; gap: 10rpx; transform: translateX(-16rpx); } .race-panel__metric-group { max-width: 100%; box-sizing: border-box; display: flex; align-items: baseline; color: #ffffff; } .race-panel__metric-group--left { justify-content: center; transform: translateX(16rpx); } .race-panel__metric-group--right { justify-content: center; transform: translateX(-16rpx); } .race-panel__metric-value { line-height: 1; text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16); } .race-panel__metric-value--distance { font-size: 54rpx; font-weight: 700; } .race-panel__metric-value--speed { font-size: 48rpx; font-weight: 400; } .race-panel__metric-unit { line-height: 1; margin-left: 6rpx; opacity: 0.95; } .race-panel__metric-unit--distance { font-size: 24rpx; font-weight: 600; } .race-panel__metric-unit--speed { font-size: 18rpx; font-weight: 500; } .race-panel__progress { max-width: 100%; box-sizing: border-box; font-size: 50rpx; line-height: 1; font-weight: 400; text-shadow: 0 2rpx 0 rgba(255, 255, 255, 0.16); } .race-panel__tag { position: absolute; z-index: 3; min-width: 56rpx; height: 32rpx; padding: 0 10rpx; background: #000000; color: #ffffff; font-size: 16rpx; line-height: 32rpx; text-align: center; letter-spacing: 2rpx; } .race-panel__tag--top-left { top: 0; left: 0; } .race-panel__tag--top-right { top: 0; right: 0; } .race-panel__tag--bottom-left { left: 0; bottom: 0; } .race-panel__tag--bottom-right { right: 0; bottom: 0; } .map-punch-button { position: absolute; right: 24rpx; bottom: 244rpx; width: 92rpx; height: 92rpx; border-radius: 50%; background: rgba(78, 92, 106, 0.82); box-shadow: 0 12rpx 28rpx rgba(22, 34, 46, 0.22), inset 0 0 0 2rpx rgba(255, 255, 255, 0.08); z-index: 18; } .map-punch-button__text { font-size: 20rpx; line-height: 92rpx; font-weight: 800; text-align: center; color: rgba(236, 241, 246, 0.88); } .map-punch-button--active { background: rgba(92, 255, 237, 0.96); box-shadow: 0 0 0 5rpx rgba(149, 255, 244, 0.18), 0 0 30rpx rgba(92, 255, 237, 0.5); animation: punch-button-ready 1s ease-in-out infinite; } .map-punch-button--active .map-punch-button__text { color: #064d46; } .race-panel__line { position: absolute; z-index: 1; height: 2rpx; box-shadow: 0 0 6rpx rgba(255, 255, 255, 0.2); } .race-panel__line--center { left: 33.3333%; right: 33.3333%; top: 50%; transform: translateY(-50%); background: rgba(255, 255, 255, 0.86); } .race-panel__line--left-mid { left: 0; width: 33.3333%; top: 50%; transform: translateY(-50%); background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.78) 100%); } .race-panel__line--right-mid { right: 0; width: 33.3333%; top: 50%; transform: translateY(-50%); background: linear-gradient(90deg, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.08) 100%); } .race-panel__line--left-top, .race-panel__line--left-bottom, .race-panel__line--right-top, .race-panel__line--right-bottom { width: 23%; top: 50%; } .race-panel__line--left-top { right: 66.6667%; transform-origin: right center; transform: translateY(-50%) rotate(70deg); background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.82) 100%); } .race-panel__line--left-bottom { right: 66.6667%; transform-origin: right center; transform: translateY(-50%) rotate(-70deg); background: linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.82) 100%); } .race-panel__line--right-top { left: 66.6667%; transform-origin: left center; transform: translateY(-50%) rotate(-70deg); background: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.08) 100%); } .race-panel__line--right-bottom { left: 66.6667%; transform-origin: left center; transform: translateY(-50%) rotate(70deg); background: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.08) 100%); } .race-panel__chevrons { position: relative; width: 24rpx; height: 24rpx; opacity: 0.5; flex-shrink: 0; } .race-panel__chevron { position: absolute; right: 6rpx; top: 50%; width: 10rpx; height: 10rpx; border-top: 3rpx solid rgba(255, 255, 255, 0.78); border-right: 3rpx solid rgba(255, 255, 255, 0.78); transform: translateY(-50%) rotate(45deg); } .race-panel__chevron--offset { right: 0; } .debug-modal { position: absolute; inset: 0; display: flex; align-items: flex-end; justify-content: center; padding: 0 20rpx 28rpx; box-sizing: border-box; background: rgba(7, 18, 12, 0.34); z-index: 30; } .debug-modal__dialog { width: 100%; max-height: 72vh; border-radius: 36rpx; background: rgba(248, 251, 244, 0.98); box-shadow: 0 20rpx 60rpx rgba(7, 18, 12, 0.24); overflow: hidden; } .debug-modal__header { display: flex; align-items: center; justify-content: flex-end; gap: 20rpx; padding: 28rpx 28rpx 20rpx; border-bottom: 1rpx solid rgba(22, 48, 32, 0.08); } .debug-modal__eyebrow { font-size: 20rpx; letter-spacing: 4rpx; color: #5f7a65; } .debug-modal__title { margin-top: 8rpx; font-size: 34rpx; font-weight: 600; color: #163020; } .debug-modal__close { flex-shrink: 0; padding: 14rpx 22rpx; border-radius: 999rpx; background: #163020; color: #f7fbf2; font-size: 24rpx; } .debug-modal__content { max-height: calc(72vh - 108rpx); padding: 12rpx 28rpx 30rpx; box-sizing: border-box; } .info-panel__row { display: flex; align-items: flex-start; justify-content: space-between; gap: 24rpx; padding: 10rpx 0; border-bottom: 1rpx solid rgba(22, 48, 32, 0.08); } .info-panel__row--stack { align-items: flex-start; } .info-panel__row:last-of-type { border-bottom: none; } .info-panel__label { width: 148rpx; flex-shrink: 0; font-size: 22rpx; letter-spacing: 2rpx; color: #5f7a65; text-align: left; text-transform: uppercase; } .info-panel__value { flex: 1; min-width: 0; font-size: 25rpx; line-height: 1.45; color: #163020; text-align: right; word-break: break-all; } .info-panel__row--stack .info-panel__value { margin-top: 0; text-align: right; color: #45624b; } .control-row { display: flex; gap: 14rpx; margin-top: 18rpx; } .control-row--triple .control-chip { font-size: 23rpx; } .control-chip { flex: 1; min-width: 0; padding: 20rpx 16rpx; border-radius: 999rpx; background: #d7e8da; color: #163020; font-size: 26rpx; text-align: center; box-sizing: border-box; } .control-chip--primary { background: #2d6a4f; color: #f7fbf2; } .control-chip--secondary { background: #eef6ea; color: #45624b; } .control-chip--active { background: #2d6a4f; color: #f7fbf2; } .race-panel__cell--action { justify-content: flex-start; padding-left: 44rpx; } .race-panel__cell--timer { padding-left: 12rpx; padding-right: 12rpx; } .race-panel__cell--mileage { justify-content: flex-end; padding-right: 56rpx; } .race-panel__cell--distance { justify-content: flex-start; padding-left: 28rpx; } .race-panel__cell--progress { padding-left: 8rpx; padding-right: 8rpx; } .race-panel__cell--speed { justify-content: flex-end; padding-right: 32rpx; } .race-panel__timer, .race-panel__progress, .race-panel__mileage, .race-panel__metric-group { max-width: 100%; box-sizing: border-box; } .game-punch-hint { position: absolute; left: 50%; bottom: 280rpx; transform: translateX(-50%); max-width: 72vw; padding: 14rpx 24rpx; border-radius: 999rpx; background: rgba(18, 33, 24, 0.78); color: #f7fbf2; font-size: 24rpx; line-height: 1.2; text-align: center; z-index: 16; pointer-events: none; } .game-punch-feedback { position: absolute; left: 50%; top: 18%; transform: translateX(-50%); min-width: 240rpx; padding: 20rpx 28rpx; border-radius: 24rpx; color: #ffffff; font-size: 24rpx; font-weight: 700; text-align: center; box-shadow: 0 16rpx 36rpx rgba(0, 0, 0, 0.18); z-index: 17; pointer-events: none; } .game-punch-feedback--neutral { background: rgba(27, 109, 189, 0.92); } .game-punch-feedback--success { background: rgba(37, 134, 88, 0.94); } .game-punch-feedback--warning { background: rgba(196, 117, 18, 0.94); } .game-content-card { position: absolute; left: 50%; top: 26%; width: 440rpx; max-width: calc(100vw - 72rpx); transform: translateX(-50%); padding: 28rpx 28rpx 24rpx; border-radius: 28rpx; background: rgba(248, 251, 244, 0.96); box-shadow: 0 18rpx 48rpx rgba(22, 48, 32, 0.18); box-sizing: border-box; z-index: 17; } .game-content-card__title { font-size: 34rpx; line-height: 1.2; font-weight: 700; color: #163020; } .game-content-card__body { margin-top: 12rpx; font-size: 24rpx; line-height: 1.5; color: #45624b; } .game-content-card__hint { margin-top: 16rpx; font-size: 20rpx; color: #809284; } .race-panel__action-button { display: flex; align-items: center; justify-content: center; min-width: 116rpx; min-height: 72rpx; padding: 0 20rpx; border-radius: 999rpx; background: rgba(78, 92, 106, 0.54); border: 2rpx solid rgba(210, 220, 228, 0.18); box-sizing: border-box; box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, 0.06); } .race-panel__action-button--active { background: rgba(255, 226, 88, 0.98); border-color: rgba(255, 247, 194, 0.98); box-shadow: 0 0 0 4rpx rgba(255, 241, 158, 0.18), 0 0 28rpx rgba(255, 239, 122, 0.42); animation: punch-button-ready 1s ease-in-out infinite; } .race-panel__action-button-text { font-size: 24rpx; line-height: 1; font-weight: 700; color: rgba(236, 241, 246, 0.86); } .race-panel__action-button--active .race-panel__action-button-text { color: #775000; } @keyframes punch-button-ready { 0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(255, 241, 158, 0.22), 0 0 18rpx rgba(255, 239, 122, 0.28); } 50% { transform: scale(1.06); box-shadow: 0 0 0 8rpx rgba(255, 241, 158, 0.08), 0 0 34rpx rgba(255, 239, 122, 0.52); } 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(255, 241, 158, 0.22), 0 0 18rpx rgba(255, 239, 122, 0.28); } }