button::after { border: none; } .page { padding: 32rpx; min-height: 100vh; box-sizing: border-box; background: #FDFBF7; } .page.has-bottom { padding-bottom: calc(32rpx + env(safe-area-inset-bottom)); } /* ---- shared feedback ---- */ .btn-hover { opacity: .85; transform: scale(.98); } .link-hover { opacity: .7; } /* ---- skeleton ---- */ .skeleton-card { padding: 40rpx 32rpx; } .skeleton { background: #eee; border-radius: 8rpx; } .skeleton-avatar { width: 112rpx; height: 112rpx; border-radius: 50%; margin-bottom: 28rpx; } .skeleton-line { height: 28rpx; border-radius: 8rpx; background: #eee; margin-top: 20rpx; } .w-60 { width: 60%; } .w-40 { width: 40%; } .w-80 { width: 80%; } .w-70 { width: 70%; } /* ---- error state ---- */ .error-card { margin-top: 120rpx; text-align: center; } .error-icon { width: 96rpx; height: 96rpx; line-height: 96rpx; margin: 0 auto 24rpx; border-radius: 50%; background: #fdecea; color: #c0392b; font-size: 48rpx; font-weight: 700; text-align: center; } .error-title { color: #5A4A3A; font-size: 28rpx; margin-bottom: 48rpx; } .btn-retry { display: inline-block; min-width: 240rpx; background: #C67B30; color: #fff; border-radius: 12rpx; } /* ---- phone login ---- */ .login-wrap { min-height: calc(100vh - 200rpx); display: flex; align-items: center; justify-content: center; } .login-card { width: 100%; text-align: center; } .login-icon { font-size: 96rpx; line-height: 1; margin-bottom: 24rpx; } .login-title { font-size: 40rpx; font-weight: 700; color: #C67B30; margin-bottom: 20rpx; } .login-desc { font-size: 26rpx; color: #8B7A6A; line-height: 1.6; margin-bottom: 48rpx; } .btn-phone { width: 100%; background: #C67B30; color: #fff; border-radius: 12rpx; } .btn-phone[disabled] { background: #d8c7b4; color: #fff; } .error { margin-top: 24rpx; font-size: 26rpx; color: #c0392b; } /* ---- profile header ---- */ .profile-card { padding: 32rpx; } .profile-head { display: flex; align-items: center; } .avatar, .avatar-fallback { width: 112rpx; height: 112rpx; border-radius: 50%; overflow: hidden; } .avatar { background: #f6efe6; } .avatar-fallback { display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #C67B30, #e3b37c); color: #fff; font-size: 48rpx; font-weight: 700; } .avatar-click { position: relative; flex-shrink: 0; } .avatar-btn { width: 112rpx; height: 112rpx; margin: 0; padding: 0; line-height: 1; border: none; background: transparent; border-radius: 50%; overflow: hidden; display: block; } .avatar-btn .avatar { display: block; } .avatar-btn[disabled] { opacity: .7; } .avatar-camera { position: absolute; right: -2rpx; bottom: -2rpx; width: 40rpx; height: 40rpx; line-height: 36rpx; text-align: center; font-size: 20rpx; color: #fff; background: #C67B30; border-radius: 50%; border: 3rpx solid #FDFBF7; } .avatar-hover { opacity: .85; transform: scale(.98); } .profile-meta { flex: 1; min-width: 0; margin-left: 24rpx; } .profile-row { display: flex; align-items: center; gap: 12rpx; } .profile-name { font-size: 36rpx; font-weight: 700; color: #2C1810; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .profile-sub { margin-top: 8rpx; font-size: 24rpx; color: #8B7A6A; } .badge { padding: 4rpx 14rpx; border-radius: 999rpx; font-size: 20rpx; flex-shrink: 0; } .badge.role { background: #f6efe6; color: #C67B30; } /* ---- info / class list ---- */ .info-card, .classlist-card { padding: 28rpx; } .info-title { font-size: 30rpx; font-weight: 700; color: #2C1810; margin-bottom: 8rpx; } .info-row, .class-row { display: flex; align-items: center; justify-content: space-between; padding: 18rpx 0; border-bottom: 1rpx solid #f2ede7; } .info-row:last-child, .class-row:last-child { border-bottom: none; } .info-label { color: #8B7A6A; font-size: 26rpx; flex-shrink: 0; } .info-value { color: #2C1810; font-size: 28rpx; max-width: 60%; text-align: right; overflow: hidden; text-overflow: ellipsis; } .classlist-card { margin-top: 24rpx; } .classlist-card .info-title { margin-bottom: 8rpx; } /* ---- bottom ---- */ .bottom-actions { margin-top: 48rpx; padding-top: 24rpx; } /* ---- privacy row ---- */ .privacy-row { display: flex; align-items: flex-start; margin-top: 28rpx; text-align: left; } .checkbox { width: 32rpx; height: 32rpx; border: 2rpx solid #D8C7B4; border-radius: 6rpx; margin-right: 14rpx; margin-top: 2rpx; flex-shrink: 0; display: flex; align-items: center; justify-content: center; background: #fff; } .checkbox.checked { background: #C67B30; border-color: #C67B30; } .check-icon { color: #fff; font-size: 22rpx; line-height: 1; font-weight: 700; } .privacy-text { flex: 1; font-size: 24rpx; color: #8B7A6A; line-height: 1.6; } .privacy-text .link { color: #C67B30; } /* ---- delete account ---- */ .btn-delete { background: #fff; color: #c0392b; border: 1rpx solid #f0b4ae; border-radius: 12rpx; margin-bottom: 20rpx; } /* ---- profile name edit ---- */