Files
----/前端源码/uni-app/pages/test-name-live/test-name-live.vue

1041 lines
23 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view
class="live-root"
:class="{ 'live-root--desktop': isDesktop, 'live-root--mobile': !isDesktop }"
>
<!-- 与登录页同一套玄幻背景八卦太极祥云阵环等 -->
<MysticFantasyBg :round-phase="roundPhase" />
<block v-if="!showDetail">
<!-- 电脑端内容区居中加宽手机端全宽 Tab 内测名一致 -->
<view class="live-content">
<TestNameScreen ref="testNameFormRef" @test="handleTest" />
</view>
</block>
<!-- 结果详解弹层个人 / 公司测名详解电脑端居中面板内容组件不变 -->
<view
v-else
class="live-detail-modal"
:class="{ 'live-detail-modal--desktop': isDesktop }"
@click="closeDetail"
>
<view
class="live-detail-modal-body"
:class="{ 'live-detail-modal-body--desktop': isDesktop }"
@click.stop=""
>
<TestNameDetail
v-if="detailKind === 'personal'"
:data="reportData"
:desktop-layout="isDesktop"
@back="closeDetail"
/>
<CompanyNamingDetailDesktop
v-else-if="isDesktop"
:data="reportData"
:show-business-fortune="companyShowBusinessFortune"
@back="closeDetail"
@business-fortune="() => {}"
/>
<CompanyNamingDetail
v-else
:data="reportData"
:show-business-fortune="companyShowBusinessFortune"
:desktop-layout="isDesktop"
@back="closeDetail"
@business-fortune="() => {}"
/>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import TestNameScreen from '../../components/screens/TestName.vue';
import TestNameDetail from '../../components/screens/TestNameDetail.vue';
import CompanyNamingDetail from '../../components/screens/CompanyNamingDetail.vue';
import CompanyNamingDetailDesktop from '../../components/screens/CompanyNamingDetailDesktop.vue';
import MysticFantasyBg from '../../components/MysticFantasyBg.vue';
import { namingApi } from '../../api/naming';
import { showToast } from '../../utils/uni-compat';
import { getIsDesktopLayout } from '../../utils/device-layout';
import {
classifyLiveTestDetail,
pollTestSolutionDetail,
pollUntilSolutionIdFromScoring,
} from '../../utils/poll-test-solution-detail';
type LiveRoundPhase = 'ready' | 'loading' | 'result';
type PersonalTestParams = {
lastName: string;
firstName: string;
gender: 'male' | 'female';
birthDate: string;
};
type CompanyTestParams = {
companyName?: string;
industry: string;
address: string;
target_audience: string;
members: Array<{ name: string; birth_date: string }>;
};
type TestMode = 'personal' | 'company';
const testNameFormRef = ref<{ closeLoading: () => void } | null>(null);
/** 电脑端网页布局 vs 手机端布局(随窗口尺寸变化更新) */
const isDesktop = ref(
typeof window !== 'undefined' ? getIsDesktopLayout() : false,
);
const roundPhase = ref<LiveRoundPhase>('ready');
const reportData = ref<any | null>(null);
const showDetail = ref(false);
/** 详解弹层:个人测名 vs 公司测名(与 index 我的方案分流一致) */
const detailKind = ref<'personal' | 'company'>('personal');
const companyShowBusinessFortune = ref(false);
let pollAbort: AbortController | null = null;
const syncDeviceLayout = () => {
if (typeof window === 'undefined') return;
isDesktop.value = getIsDesktopLayout();
};
onMounted(() => {
syncDeviceLayout();
window.addEventListener('resize', syncDeviceLayout, { passive: true });
});
onUnmounted(() => {
pollAbort?.abort();
if (typeof window !== 'undefined') {
window.removeEventListener('resize', syncDeviceLayout);
}
});
const closeDetail = () => {
showDetail.value = false;
reportData.value = null;
detailKind.value = 'personal';
companyShowBusinessFortune.value = false;
roundPhase.value = 'ready';
};
const handleTest = async (mode: TestMode, params: PersonalTestParams | CompanyTestParams) => {
roundPhase.value = 'loading';
pollAbort?.abort();
pollAbort = new AbortController();
const signal = pollAbort.signal;
try {
let res: any;
if (mode === 'personal') {
const p = params as PersonalTestParams;
res = await namingApi.personalScoring({
surname: String(p.lastName || '').trim(),
given_name: String(p.firstName || '').trim(),
gender: p.gender,
birthday: p.birthDate,
});
} else {
const p = params as CompanyTestParams;
res = await namingApi.companyScoring({
company_name: String(p.companyName || '').trim(),
industry: String(p.industry || '').trim(),
address: String(p.address || '').trim(),
target_audience: String(p.target_audience || '').trim(),
members: Array.isArray(p.members)
? p.members
.filter((m) => m?.name && m?.birth_date)
.map((m) => ({
name: String(m.name || '').trim(),
birthday: m.birth_date,
}))
: [],
});
}
const solutionId = await pollUntilSolutionIdFromScoring(res, {
intervalMs: 5000,
signal,
});
const detail = await pollTestSolutionDetail(solutionId, mode, {
intervalMs: 5000,
signal,
});
const classified = classifyLiveTestDetail(detail, mode);
detailKind.value = classified.kind;
companyShowBusinessFortune.value = classified.showBusinessFortune;
reportData.value = detail;
roundPhase.value = 'result';
showDetail.value = true;
} catch (error: any) {
if (String(error?.message || '') === 'aborted') {
roundPhase.value = 'ready';
return;
}
showToast({
title: error?.msg || error?.message || '测算失败,请稍后重试',
icon: 'none',
});
roundPhase.value = 'ready';
} finally {
testNameFormRef.value?.closeLoading();
}
};
</script>
<style scoped>
.live-root {
min-height: 100vh;
background: transparent;
color: #fff;
position: relative;
overflow: hidden;
display: block;
}
/* 电脑端:内容区居中,阅读宽度更接近网页 */
.live-root--desktop .live-content {
position: relative;
z-index: 2;
width: 100%;
max-width: 520px;
margin: 0 auto;
padding: 40px 32px 48px;
box-sizing: border-box;
}
/* 电脑端:测名表单与登录页同系 — 深色玻璃 + 金边 */
.live-root--desktop :deep(.testname-top-bar) {
opacity: 0.35;
}
.live-root--desktop :deep(.testname-title) {
color: #f2e6d8;
text-shadow: 0 0 24px rgba(212, 175, 55, 0.25);
}
.live-root--desktop :deep(.testname-mode-toggle-bg) {
background: rgba(15, 23, 42, 0.55);
border: 1px solid rgba(212, 175, 55, 0.22);
backdrop-filter: blur(8px);
}
.live-root--desktop :deep(.testname-mode-toggle-slider) {
background: rgba(2, 6, 23, 0.75);
border-color: rgba(212, 175, 55, 0.28);
box-shadow: 0 0 12px rgba(212, 175, 55, 0.12);
}
.live-root--desktop :deep(.testname-mode-toggle-btn) {
color: rgba(233, 233, 239, 0.55);
}
.live-root--desktop :deep(.testname-mode-toggle-btn-active) {
color: #d4af37;
}
.live-root--desktop :deep(.testname-form-card) {
background: rgba(15, 23, 42, 0.55);
border: 1px solid rgba(212, 175, 55, 0.22);
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
backdrop-filter: blur(12px);
}
.live-root--desktop :deep(.testname-corner) {
border-color: rgba(212, 175, 55, 0.35);
}
.live-root--desktop :deep(.testname-label),
.live-root--desktop :deep(.testname-label-center),
.live-root--desktop :deep(.testname-label-with-icon) {
color: rgba(242, 230, 216, 0.78);
}
.live-root--desktop :deep(.testname-input-wrapper) {
border-bottom-color: rgba(148, 163, 184, 0.35);
}
.live-root--desktop :deep(.testname-input-wrapper-focus) {
border-bottom-color: rgba(212, 175, 55, 0.55);
}
.live-root--desktop :deep(.testname-input-name) {
color: #f2e6d8;
}
.live-root--desktop :deep(.testname-input-name::placeholder) {
color: rgba(148, 163, 184, 0.55);
}
.live-root--desktop :deep(.testname-gender-btn) {
border-color: rgba(148, 163, 184, 0.4);
color: rgba(233, 233, 239, 0.75);
background: rgba(2, 6, 23, 0.35);
}
.live-root--desktop :deep(.testname-gender-btn-active) {
border-color: rgba(212, 175, 55, 0.55);
background: linear-gradient(145deg, rgba(139, 35, 35, 0.85), rgba(212, 175, 55, 0.2));
color: #fdfbf7;
box-shadow: 0 0 20px rgba(212, 175, 55, 0.2);
}
.live-root--desktop :deep(.testname-date-picker-trigger) {
background: rgba(2, 6, 23, 0.45);
border-color: rgba(212, 175, 55, 0.18);
}
.live-root--desktop :deep(.testname-date-picker-text) {
color: rgba(148, 163, 184, 0.65);
}
.live-root--desktop :deep(.testname-date-picker-text-filled) {
color: #f2e6d8;
}
.live-root--desktop :deep(.testname-input-company) {
background: rgba(2, 6, 23, 0.45);
border-color: rgba(148, 163, 184, 0.35);
color: #f2e6d8;
}
.live-root--desktop :deep(.testname-input-company::placeholder) {
color: rgba(148, 163, 184, 0.45);
}
.live-root--desktop :deep(.testname-members-tip) {
color: rgba(212, 175, 55, 0.55);
}
.live-root--desktop :deep(.testname-member-item) {
background: rgba(2, 6, 23, 0.45);
border-color: rgba(148, 163, 184, 0.35);
}
.live-root--desktop :deep(.testname-member-number) {
background: rgba(212, 175, 55, 0.12);
color: rgba(233, 233, 239, 0.75);
}
.live-root--desktop :deep(.testname-member-name) {
color: #f2e6d8;
}
.live-root--desktop :deep(.testname-member-name::placeholder) {
color: rgba(148, 163, 184, 0.45);
}
.live-root--desktop :deep(.testname-member-divider) {
background: rgba(148, 163, 184, 0.35);
}
.live-root--desktop :deep(.testname-member-date) {
color: rgba(148, 163, 184, 0.65);
}
.live-root--desktop :deep(.testname-member-date-filled) {
color: #f2e6d8;
}
.live-root--desktop :deep(.testname-divider) {
background: rgba(212, 175, 55, 0.15);
}
.live-root--desktop :deep(.testname-submit-btn) {
background: linear-gradient(135deg, rgba(139, 35, 35, 0.95), rgba(90, 20, 20, 0.98));
border: 1px solid rgba(212, 175, 55, 0.25);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 24px rgba(212, 175, 55, 0.12);
}
.live-root--desktop :deep(.testname-submit-btn-border) {
border-color: rgba(212, 175, 55, 0.35);
}
.live-root--desktop :deep(.testname-submit-text) {
color: #fdfbf7;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
}
/* 电脑端:详解以居中「网页页」形式展示,内容仍为原详解组件 */
.live-root--desktop .live-detail-modal--desktop {
display: flex;
align-items: center;
justify-content: center;
padding: 16px 20px;
box-sizing: border-box;
background: rgba(2, 6, 23, 0.78);
backdrop-filter: blur(12px);
}
.live-root--desktop .live-detail-modal-body--desktop {
position: relative;
inset: auto;
width: 100%;
max-width: 1320px;
/* 电脑端:适当拉高弹层,避免底部模块在可视区内被裁切 */
height: min(98vh, calc(100vh - 12px));
max-height: calc(100vh - 12px);
margin: 0 auto;
display: flex;
flex-direction: column;
border-radius: 16px;
overflow: hidden;
border: 1px solid rgba(212, 175, 55, 0.22);
box-shadow: 0 28px 90px rgba(0, 0, 0, 0.55);
background: rgba(6, 8, 16, 0.92);
}
/* 详解根组件:占满面板,内部由各页 desktop 样式负责双列与滚动 */
.live-root--desktop .live-detail-modal-body--desktop :deep(.test-name-detail),
.live-root--desktop .live-detail-modal-body--desktop :deep(.company-detail) {
min-height: 100%;
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
border-radius: 12px;
}
.live-root--desktop .live-detail-modal-body--desktop :deep(.company-detail) {
position: relative !important;
top: auto !important;
left: auto !important;
right: auto !important;
bottom: auto !important;
width: 100%;
max-height: 100%;
min-height: 0;
z-index: 1;
}
/* 手机端:与 Tab 内八字测名一致,不额外收窄 */
.live-root--mobile .live-content {
position: relative;
z-index: 2;
width: 100%;
}
.live-content {
position: relative;
z-index: 2;
width: 100%;
}
.live-top {
padding: 18rpx 20rpx 10rpx;
}
.live-video {
height: 220rpx;
border-radius: 20rpx;
position: relative;
overflow: hidden;
background: radial-gradient(circle at top, #2a2040, #0b0b12 55%);
border: 1px solid rgba(212, 175, 55, 0.15);
}
.live-video-shimmer {
position: absolute;
inset: -40%;
background: linear-gradient(120deg, rgba(212, 175, 55, 0) 35%, rgba(212, 175, 55, 0.22) 50%, rgba(212, 175, 55, 0) 65%);
transform: translateX(-30%);
animation: live-shimmer 2.6s linear infinite;
}
@keyframes live-shimmer {
0% {
transform: translateX(-40%);
}
100% {
transform: translateX(40%);
}
}
.live-video-overlay {
position: relative;
z-index: 2;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 26rpx;
}
.live-title-row {
display: flex;
align-items: center;
gap: 16rpx;
}
.live-title {
font-size: 34rpx;
font-weight: 900;
letter-spacing: 0.2em;
color: #d4af37;
}
.live-pill {
padding: 8rpx 18rpx;
border-radius: 999rpx;
background: rgba(212, 175, 55, 0.12);
border: 1px solid rgba(212, 175, 55, 0.3);
}
.live-sub-row {
margin-top: 10rpx;
display: flex;
flex-direction: column;
gap: 8rpx;
}
.live-subtext {
font-size: 22rpx;
color: rgba(233, 233, 239, 0.78);
}
.live-live-row {
display: flex;
align-items: center;
gap: 12rpx;
}
.live-live-dot {
width: 12rpx;
height: 12rpx;
border-radius: 50%;
background: #ff2d2d;
box-shadow: 0 0 20rpx rgba(255, 45, 45, 0.4);
animation: live-pulse 1.2s ease-in-out infinite;
}
.live-live-text {
font-size: 22rpx;
font-weight: 900;
letter-spacing: 0.12em;
color: #ff2d2d;
}
.live-inline-count {
font-size: 18rpx;
color: rgba(233, 233, 239, 0.75);
letter-spacing: 0.06em;
}
@keyframes live-pulse {
0%,
100% {
transform: scale(0.9);
opacity: 0.75;
}
50% {
transform: scale(1.15);
opacity: 1;
}
}
.live-main {
flex: 1;
display: flex;
gap: 18rpx;
padding: 0 20rpx 24rpx;
box-sizing: border-box;
}
.live-left {
flex: 1.15;
min-width: 0;
}
.live-right {
flex: 0.85;
min-width: 0;
}
.live-info {
height: calc(100vh - 280rpx);
border-radius: 20rpx;
border: 1px solid rgba(212, 175, 55, 0.08);
background: rgba(15, 23, 42, 0.35);
overflow: hidden;
display: flex;
flex-direction: column;
gap: 16rpx;
padding: 16rpx;
box-sizing: border-box;
}
.live-info-card {
border-radius: 16rpx;
border: 1px solid rgba(148, 163, 184, 0.22);
background: rgba(2, 6, 23, 0.45);
padding: 16rpx 14rpx;
}
.live-info-card.ghost {
background: rgba(2, 6, 23, 0.22);
}
.live-info-title {
display: block;
font-size: 22rpx;
font-weight: 900;
color: #d4af37;
letter-spacing: 0.06em;
margin-bottom: 12rpx;
}
.live-info-line {
display: block;
font-size: 20rpx;
color: rgba(233, 233, 239, 0.78);
margin-bottom: 8rpx;
line-height: 1.4;
}
.live-info-tip {
display: block;
font-size: 18rpx;
color: rgba(233, 233, 239, 0.62);
margin-top: 10rpx;
line-height: 1.5;
}
.live-form-scroll {
height: calc(100vh - 280rpx);
border-radius: 20rpx;
overflow: hidden;
border: 1px solid rgba(212, 175, 55, 0.08);
background: rgba(253, 251, 247, 0.02);
}
/* 将现有测名组件“全屏最小高度”调整为嵌入式 */
:deep(.testname-screen) {
min-height: 100vh !important;
background: transparent !important;
position: relative;
z-index: 2;
}
:deep(.testname-bg-texture) {
opacity: 0 !important;
background-image: none !important;
}
.live-result-scroll {
height: calc(100vh - 280rpx);
}
.live-result-card {
height: 100%;
border-radius: 20rpx;
background: rgba(15, 23, 42, 0.65);
border: 1px solid rgba(148, 163, 184, 0.28);
overflow: hidden;
box-shadow: 0 20rpx 50rpx rgba(0, 0, 0, 0.45);
}
.live-result-head {
padding: 24rpx 26rpx;
border-bottom: 1px solid rgba(148, 163, 184, 0.22);
display: flex;
flex-direction: column;
gap: 14rpx;
}
.live-result-label {
font-size: 26rpx;
font-weight: 800;
letter-spacing: 0.08em;
color: #d4af37;
}
.live-result-actions {
display: flex;
gap: 14rpx;
}
.live-action-btn {
flex: 1;
padding: 14rpx 0;
border-radius: 12rpx;
background: rgba(212, 175, 55, 0.18);
border: 1px solid rgba(212, 175, 55, 0.32);
color: #fff;
font-weight: 700;
font-size: 22rpx;
}
.live-action-btn.ghost {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(148, 163, 184, 0.3);
}
.live-score-row {
padding: 28rpx 26rpx;
display: flex;
gap: 22rpx;
align-items: center;
}
.live-score-big {
min-width: 180rpx;
}
.live-score {
font-size: 82rpx;
font-weight: 900;
letter-spacing: 0.06em;
background: linear-gradient(to bottom, #d4af37, #8a6e1e);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
line-height: 1;
}
.live-stars {
margin-top: 10rpx;
display: flex;
gap: 10rpx;
}
.live-star {
font-size: 26rpx;
color: rgba(212, 175, 55, 0.35);
}
.live-star.active {
color: #d4af37;
text-shadow: 0 0 10rpx rgba(212, 175, 55, 0.35);
}
.live-name-col {
flex: 1;
min-width: 0;
}
.live-name {
font-size: 30rpx;
font-weight: 900;
letter-spacing: 0.08em;
color: #f2e6d8;
display: block;
}
.live-quote {
margin-top: 12rpx;
font-size: 22rpx;
color: rgba(233, 233, 239, 0.72);
line-height: 1.8;
line-clamp: 3;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.live-result-foot {
padding: 0 26rpx 26rpx;
}
.live-tip {
font-size: 20rpx;
color: rgba(233, 233, 239, 0.7);
}
.live-mystic {
height: 100%;
border-radius: 20rpx;
overflow: hidden;
border: 1px solid rgba(212, 175, 55, 0.08);
background: radial-gradient(circle at top, rgba(212, 175, 55, 0.12), rgba(15, 23, 42, 0.35) 55%);
display: flex;
flex-direction: column;
padding: 18rpx;
box-sizing: border-box;
}
.mystic-card {
flex: 1;
border-radius: 18rpx;
border: 1px solid rgba(148, 163, 184, 0.22);
background: rgba(2, 6, 23, 0.35);
box-shadow: 0 20rpx 50rpx rgba(0, 0, 0, 0.35);
padding: 18rpx 16rpx;
display: flex;
flex-direction: column;
gap: 14rpx;
}
.mystic-topline {
display: flex;
flex-direction: column;
gap: 6rpx;
}
.mystic-title {
font-size: 26rpx;
font-weight: 900;
letter-spacing: 0.08em;
color: #d4af37;
}
.mystic-status {
font-size: 18rpx;
color: rgba(233, 233, 239, 0.78);
letter-spacing: 0.06em;
}
.mystic-arc {
flex: 1;
min-height: 220rpx;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.mystic-arc-ring {
width: 220rpx;
height: 220rpx;
border-radius: 50%;
border: 1px dashed rgba(212, 175, 55, 0.55);
opacity: 0.35;
animation: mystic-rotate 6s linear infinite;
}
.mystic-arc-ring.active {
opacity: 0.75;
border-color: rgba(212, 175, 55, 0.9);
animation-duration: 2.2s;
}
.mystic-arc-core {
position: absolute;
width: 78rpx;
height: 78rpx;
border-radius: 50%;
background: radial-gradient(circle at top, rgba(212, 175, 55, 0.9), rgba(139, 35, 35, 0.25));
box-shadow: 0 0 60rpx rgba(212, 175, 55, 0.25);
}
.mystic-charm {
font-size: 18rpx;
color: rgba(233, 233, 239, 0.78);
letter-spacing: 0.08em;
}
.mystic-energy {
padding-top: 8rpx;
}
.mystic-energy-bar {
height: 10rpx;
border-radius: 999px;
background: rgba(212, 175, 55, 0.18);
overflow: hidden;
position: relative;
}
.mystic-energy-bar::after {
content: "";
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 40%;
border-radius: 999px;
background: linear-gradient(90deg, rgba(212, 175, 55, 0.1), rgba(212, 175, 55, 0.9));
transform: translateX(-120%);
animation: mystic-energy 2.4s ease-in-out infinite;
}
.mystic-energy-bar.phase-ready::after {
animation-duration: 3.4s;
opacity: 0.75;
}
.mystic-energy-bar.phase-loading::after {
animation-duration: 1.6s;
opacity: 1;
}
.mystic-energy-bar.phase-result::after {
animation-duration: 2.8s;
opacity: 0.9;
}
.mystic-tip {
font-size: 16rpx;
color: rgba(233, 233, 239, 0.6);
line-height: 1.5;
}
@keyframes mystic-rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes mystic-energy {
0% {
transform: translateX(-120%);
}
50% {
transform: translateX(180%);
}
100% {
transform: translateX(180%);
}
}
.live-chat {
height: 100%;
border-radius: 20rpx;
overflow: hidden;
border: 1px solid rgba(212, 175, 55, 0.08);
background: rgba(15, 23, 42, 0.35);
display: flex;
flex-direction: column;
}
.live-chat-header {
padding: 22rpx 20rpx;
border-bottom: 1px solid rgba(148, 163, 184, 0.22);
}
.live-chat-title {
font-size: 26rpx;
font-weight: 900;
letter-spacing: 0.08em;
color: #d4af37;
}
.live-chat-header-tip {
margin-top: 10rpx;
}
.live-chat-header-tip-text {
font-size: 18rpx;
color: rgba(233, 233, 239, 0.7);
}
.live-chat-list {
flex: 1;
padding: 18rpx 18rpx 0;
}
.chat-item {
display: flex;
gap: 10rpx;
margin-bottom: 16rpx;
align-items: flex-start;
}
.chat-role {
font-size: 18rpx;
color: rgba(212, 175, 55, 0.9);
font-weight: 800;
width: 60rpx;
flex-shrink: 0;
}
.chat-text {
font-size: 20rpx;
color: rgba(233, 233, 239, 0.86);
line-height: 1.6;
word-break: break-all;
}
.live-chat-input {
display: flex;
gap: 12rpx;
padding: 14rpx 14rpx 16rpx;
border-top: 1px solid rgba(148, 163, 184, 0.22);
box-sizing: border-box;
}
.chat-input {
flex: 1;
border-radius: 12rpx;
padding: 14rpx 14rpx;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(148, 163, 184, 0.32);
color: #fff;
font-size: 22rpx;
}
.chat-send-btn {
width: 160rpx;
border-radius: 12rpx;
background: rgba(212, 175, 55, 0.18);
border: 1px solid rgba(212, 175, 55, 0.32);
color: #fff;
font-weight: 800;
font-size: 22rpx;
}
.chat-send-btn[disabled] {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(148, 163, 184, 0.25);
color: rgba(255, 255, 255, 0.55);
}
.live-detail-modal {
position: fixed;
inset: 0;
z-index: 2000;
background: rgba(0, 0, 0, 0.45);
}
.live-detail-modal-body {
position: absolute;
inset: 0;
}
.live-stream-pill {
position: fixed;
right: 22rpx;
top: calc(22rpx + env(safe-area-inset-top, 0px));
z-index: 10;
display: inline-flex;
align-items: center;
gap: 10rpx;
padding: 12rpx 16rpx;
border-radius: 999rpx;
background: rgba(10, 10, 15, 0.55);
border: 1px solid rgba(212, 175, 55, 0.28);
backdrop-filter: blur(10px);
}
.live-stream-pill-title {
font-size: 20rpx;
font-weight: 900;
letter-spacing: 0.08em;
color: #d4af37;
}
.live-stream-pill-sep {
font-size: 18rpx;
color: rgba(233, 233, 239, 0.6);
}
.live-stream-pill-state {
font-size: 18rpx;
letter-spacing: 0.06em;
color: rgba(233, 233, 239, 0.72);
}
</style>