Files
----/前端源码/uni-app/components/AnalysisResult.vue

1764 lines
42 KiB
Vue
Raw 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="analysis-result">
<!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view>
<!-- Header -->
<view class="analysis-header">
<button class="analysis-header-btn" @click="$emit('back')">
<text class="analysis-header-arrow"></text>
<text>返回</text>
</button>
<text class="analysis-header-title">姓名分析</text>
<button class="analysis-header-btn">
<text class="analysis-header-share"></text>
</button>
</view>
<!-- Content Scroll -->
<scroll-view scroll-y class="analysis-content">
<!-- 1. 总分卡片 -->
<view class="score-card" @click="openModal('score')">
<view class="score-card-corner score-card-corner-tl"></view>
<view class="score-card-corner score-card-corner-tr"></view>
<view class="score-card-corner score-card-corner-bl"></view>
<view class="score-card-corner score-card-corner-br"></view>
<view class="score-card-content">
<text class="score-card-label">TOTAL SCORE</text>
<view class="score-card-rotation">
<view class="score-card-ring"></view>
<text class="score-card-rotation-text">93</text>
</view>
<view class="score-card-stars">
<text v-for="i in 5" :key="i" class="score-card-star" :class="{ filled: i <= 4 }"></text>
</view>
<view class="score-card-divider"></view>
<text class="score-card-name">云帆</text>
<text class="score-card-poem">"长风破浪会有时,直挂云帆济沧海"</text>
</view>
</view>
<!-- 2. 字义与生肖解析 -->
<view class="section" @click="openModal('meaning')">
<view class="section-title">
<text class="section-title-icon">📖</text>
<text class="section-title-text">字义与生肖解析</text>
</view>
<!-- 组合意象 -->
<view class="meaning-card">
<view class="meaning-card-quote"></view>
<text class="meaning-card-title">组合意象</text>
<text class="meaning-card-text">
<text class="highlight"></text>高远洁白逍遥自在<text
class="highlight"></text>借风远航志在四方二字组合动静结合既有高远的志向又有脚踏实地乘风破浪的行动力
<text class="meaning-card-judge">判断</text>二字搭配极佳音律平仄相间阳平配阴平朗朗上口寓意积极向上无消极晦涩之义
</text>
</view>
<!-- 生肖喜忌 -->
<view class="zodiac-card">
<view class="zodiac-card-header">
<view class="zodiac-card-left">
<view class="zodiac-icon">🐇</view>
<view class="zodiac-info">
<text class="zodiac-label">生肖适配度</text>
<text class="zodiac-value">属兔 · 喜用</text>
</view>
</view>
<text class="zodiac-score">95</text>
</view>
<view class="zodiac-items">
<view class="zodiac-item">
<view class="zodiac-dot"></view>
<text class="zodiac-text"><text
class="zodiac-char"></text>兔喜小云为天之物虽大但柔"云"字藏"雨"水生木兔为木大利生肖</text>
</view>
<view class="zodiac-item">
<view class="zodiac-dot"></view>
<text class="zodiac-text"><text class="zodiac-char"></text>"帆"字含"巾"意为披彩衣兔披彩衣更显尊贵寓意生活富足受人敬仰</text>
</view>
</view>
</view>
</view>
<!-- 3. 单字详解 -->
<view class="section" @click="openModal('char')">
<view class="section-title">
<text class="section-title-icon"></text>
<text class="section-title-text">单字详解</text>
</view>
<view class="char-list">
<view v-for="(item, i) in charDetails" :key="i" class="char-item">
<view class="char-item-left">
<view class="char-box">{{ item.char }}</view>
<text class="char-element" :style="setWuxingColor(item.element as WuxingElement)">{{ item.element
}}</text>
</view>
<view class="char-item-right">
<view class="char-item-meta">
<text class="char-meta-label">康熙笔画<text class="char-meta-value">{{ item.stroke }}</text></text>
<text class="char-meta-label">{{ item.tone }}</text>
</view>
<text class="char-desc">{{ item.desc }}</text>
</view>
</view>
</view>
</view>
<!-- 4. 笔画与三才五格 -->
<view class="section" @click="openModal('strokes')">
<view class="section-title">
<text class="section-title-icon">#</text>
<text class="section-title-text">笔画数理分析</text>
</view>
<!-- 笔画图示 -->
<view class="strokes-display">
<view class="stroke-item">
<view class="stroke-box"></view>
<view class="stroke-label">7 <span :style="setWuxingColorText('木')">()</span></view>
</view>
<view class="stroke-line"></view>
<view class="stroke-item stroke-item-active">
<view class="stroke-box stroke-box-active"></view>
<view class="stroke-label">4 <span :style="setWuxingColorText('水')">()</span></view>
</view>
<view class="stroke-line"></view>
<view class="stroke-item stroke-item-active">
<view class="stroke-box stroke-box-active"></view>
<view class="stroke-label">6 <span :style="setWuxingColorText('水')">()</span></view>
</view>
</view>
<!-- 三才五格详解 -->
<view class="wuge-list">
<view class="wuge-item">
<view class="wuge-item-left">
<text class="wuge-name">天格 (8) · </text>
<text class="wuge-desc">祖业运 · 坚毅不拔之数</text>
</view>
<view class="wuge-bar">
<view class="wuge-bar-fill" style="width: 80%"></view>
</view>
</view>
<view class="wuge-item wuge-item-highlight">
<view class="wuge-indicator"></view>
<view class="wuge-item-left">
<text class="wuge-name wuge-name-highlight">人格 (11) · 大吉</text>
<text class="wuge-desc wuge-desc-highlight">主运 · 万物更新挽回天运</text>
</view>
<view class="wuge-bar">
<view class="wuge-bar-fill wuge-bar-fill-highlight" style="width: 95%"></view>
</view>
</view>
<view class="wuge-item">
<view class="wuge-item-left">
<text class="wuge-name">地格 (10) · 半吉</text>
<text class="wuge-desc">前运 · 终结之数雪暗飘零</text>
</view>
<view class="wuge-bar">
<view class="wuge-bar-fill wuge-bar-fill-blue" style="width: 60%"></view>
</view>
</view>
<view class="wuge-item">
<view class="wuge-item-left">
<text class="wuge-name">外格 (7) · </text>
<text class="wuge-desc">副运 · 精悍果断独立权威</text>
</view>
<view class="wuge-bar">
<view class="wuge-bar-fill" style="width: 75%"></view>
</view>
</view>
<view class="wuge-item wuge-item-red">
<view class="wuge-item-left">
<text class="wuge-name">总格 (17) · 大吉</text>
<text class="wuge-desc">后运 · 权威刚强突破万难</text>
</view>
<view class="wuge-bar">
<view class="wuge-bar-fill wuge-bar-fill-red" style="width: 90%"></view>
</view>
</view>
</view>
<!-- 三才配置 & 五行能量 -->
<view class="grid-2">
<!-- 三才配置 -->
<view class="sancai-card">
<text class="sancai-title">三才配置</text>
<view class="sancai-circles">
<view class="sancai-circle sancai-circle-small">
<text class="sancai-circle-text" :style="setWuxingCircleStyle('金')"></text>
<text class="sancai-circle-label">天才</text>
</view>
<view class="sancai-line"></view>
<view class="sancai-circle sancai-circle-large">
<text class="sancai-circle-text" :style="setWuxingCircleStyle('木')"></text>
<text class="sancai-circle-label">人才</text>
</view>
<view class="sancai-line"></view>
<view class="sancai-circle sancai-circle-small">
<text class="sancai-circle-text" :style="setWuxingCircleStyle('水')"></text>
<text class="sancai-circle-label">地才</text>
</view>
</view>
<text class="sancai-result"><text class="sancai-label">吉凶</text>金木水</text>
</view>
<!-- 五行能量 -->
<view class="wuxing-card">
<text class="wuxing-title">五行能量</text>
<view class="wuxing-bars">
<view v-for="item in wuxingData" :key="item.label" class="wuxing-bar-item">
<text class="wuxing-bar-label" :style="setWuxingColorText(item.label as WuxingElement)">{{ item.label
}}</text>
<view class="wuxing-bar-bg">
<view class="wuxing-bar-fill" :style="{ width: item.value + '%', backgroundColor: item.color }">
</view>
</view>
<text class="wuxing-bar-value">{{ item.value }}%</text>
</view>
</view>
<text class="wuxing-note">* 基础运稳固境遇安泰可得部下之力</text>
</view>
</view>
</view>
<!-- 5. 六维格局 -->
<view @click="openModal('sixdim')">
<SixDimensionRadar :labels="sixDimLabels" :values="sixDimValues" :remark="sixDimRemark" />
</view>
<!-- 6. 周易卦象 -->
<view class="section" @click="openModal('gua')">
<view class="section-title">
<text class="section-title-icon">🧭</text>
<text class="section-title-text">周易卦象</text>
</view>
<view class="gua-card">
<view class="gua-bg"></view>
<view class="gua-lines">
<view class="gua-line gua-line-solid"></view>
<view class="gua-line gua-line-solid"></view>
<view class="gua-line gua-line-broken">
<view class="gua-line-part"></view>
<view class="gua-line-part"></view>
</view>
<view class="gua-space"></view>
<view class="gua-line gua-line-broken gua-line-gray">
<view class="gua-line-part"></view>
<view class="gua-line-part"></view>
</view>
<view class="gua-line gua-line-solid gua-line-white"></view>
<view class="gua-line gua-line-broken gua-line-gray">
<view class="gua-line-part"></view>
<view class="gua-line-part"></view>
</view>
</view>
<view class="gua-content">
<view class="gua-header">
<text class="gua-name">风水涣</text>
<text class="gua-tag">上巽下坎</text>
</view>
<text class="gua-desc">风行水上涣散之象离散之中蕴含亨通寓意破旧立新利于涉大川建功立业乃是乘风破浪之吉兆</text>
</view>
</view>
</view>
<!-- 6. 开运锦囊 -->
<view class="section" @click="openModal('lucky')">
<view class="section-title">
<ActivityIcon class="section-title-icon-svg" />
<text class="section-title-text">开运锦囊</text>
</view>
<view class="lucky-grid">
<view v-for="item in luckyItems" :key="item.label" class="lucky-item">
<view class="lucky-icon" :class="item.colorClass">{{ item.icon }}</view>
<view class="lucky-info">
<text class="lucky-label">{{ item.label }}</text>
<text class="lucky-value">{{ item.value }}</text>
</view>
</view>
</view>
</view>
<!-- 7. 诗词出处 -->
<view class="section" @click="openModal('poem')">
<view class="section-title">
<text class="section-title-icon">📖</text>
<text class="section-title-text">诗词出处</text>
</view>
<view class="poem-card">
<text class="poem-quote"></text>
<text class="poem-text">"长风破浪会有时,直挂<text class="poem-highlight">云帆</text>济沧海"</text>
<text class="poem-author"> 李白行路难·其一</text>
</view>
</view>
<!-- 8. 人生运程 -->
<view class="section" @click="openModal('lifespan')">
<view class="section-title">
<text class="section-title-icon">📈</text>
<text class="section-title-text">人生运程</text>
</view>
<scroll-view scroll-x class="lifespan-scroll">
<view class="lifespan-row">
<view v-for="item in lifespanData" :key="item.age" class="lifespan-item" :class="item.colorClass">
<text class="lifespan-age">{{ item.age }}</text>
<text class="lifespan-desc">{{ item.desc }}</text>
</view>
</view>
</scroll-view>
</view>
<!-- 9. 大师寄语 -->
<view class="master-message" @click="openModal('master')">
<text class="master-message-title">大师寄语</text>
<text class="master-message-text">"云帆"一名既顺应了生肖兔喜彩衣喜水木的特性又在数理上避开了大凶之数虽地格稍弱但总格大吉属先苦后甜大器晚成之局</text>
</view>
<view class="footer">
<text class="footer-text">壹梵 · 致力于东方美学与易经智慧的传承</text>
</view>
</scroll-view>
<view v-if="showModal" class="modal-overlay" @click.stop="closeModal">
<view class="modal-container" @click.stop>
<view class="modal-header">
<text class="modal-title">{{ modalTitle }}</text>
<view class="modal-close" @click.stop="closeModal">
<text class="modal-close-icon">×</text>
</view>
</view>
<scroll-view scroll-y class="modal-body">
<view class="modal-body-contain">
<view v-if="currentModal === 'score'" class="modal-content">
<text class="modal-text">总分93</text>
<text class="modal-text">姓名云帆</text>
<text class="modal-text">"长风破浪会有时,直挂云帆济沧海"</text>
</view>
<view v-else-if="currentModal === 'meaning'" class="modal-content">
<text class="modal-section-title">组合意象</text>
<text class="modal-text">云者高远洁白逍遥自在帆者借风远航志在四方二字组合动静结合既有高远的志向又有脚踏实地乘风破浪的行动力</text>
<text class="modal-section-title">生肖喜忌</text>
<text class="modal-text">属兔 · 喜用示例水生木利生肖</text>
</view>
<view v-else-if="currentModal === 'char'" class="modal-content">
<text class="modal-section-title">单字详解</text>
<view class="modal-char-list">
<view v-for="(item, i) in charDetails" :key="i" class="modal-char-item">
<text class="modal-char-title">{{ item.char }}{{ item.element }}</text>
<text class="modal-text">康熙笔画{{ item.stroke }}</text>
<text class="modal-text">{{ item.tone }}</text>
<text class="modal-text">{{ item.desc }}</text>
</view>
</view>
</view>
<view v-else-if="currentModal === 'strokes'" class="modal-content">
<text class="modal-section-title">笔画数理分析</text>
<text class="modal-text">包含三才五格五行能量等内容当前为示例静态数据</text>
</view>
<view v-else-if="currentModal === 'sixdim'" class="modal-content">
<text class="modal-section-title">六维格局</text>
<text class="modal-text">事业财运健康家庭社交智慧六维综合评估当前为示例静态数据</text>
</view>
<view v-else-if="currentModal === 'gua'" class="modal-content">
<text class="modal-section-title">周易卦象</text>
<text class="modal-text">风行水上涣散之象离散之中蕴含亨通寓意破旧立新</text>
</view>
<view v-else-if="currentModal === 'lucky'" class="modal-content">
<text class="modal-section-title">开运锦囊</text>
<view class="modal-list">
<text v-for="(item, idx) in luckyItems" :key="idx" class="modal-text">{{ item.label }}{{ item.value }}</text>
</view>
</view>
<view v-else-if="currentModal === 'poem'" class="modal-content">
<text class="modal-section-title">诗词出处</text>
<text class="modal-text">"长风破浪会有时,直挂云帆济沧海" 李白行路难·其一</text>
</view>
<view v-else-if="currentModal === 'lifespan'" class="modal-content">
<text class="modal-section-title">人生运程</text>
<view class="modal-list">
<text v-for="(item, idx) in lifespanData" :key="idx" class="modal-text">{{ item.age }}{{ item.desc }}</text>
</view>
</view>
<view v-else-if="currentModal === 'master'" class="modal-content">
<text class="modal-section-title">大师寄语</text>
<text class="modal-text">"云帆"一名既顺应了生肖兔喜彩衣喜水木的特性又在数理上避开了大凶之数虽地格稍弱但总格大吉属先苦后甜大器晚成之局</text>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import SixDimensionRadar from './SixDimensionRadar.vue';
import ActivityIcon from './icons/ActivityIcon.vue';
import { createWuxingData, getWuxingColor, WUXING_COLORS, WuxingElement } from '@/constants/wuxing';
const wuxingData = createWuxingData([10, 40, 30, 15, 5]);
const emit = defineEmits<{
back: [];
}>();
const showModal = ref(false);
const currentModal = ref<string>('');
const modalTitles: Record<string, string> = {
score: '总分详解',
meaning: '字义与生肖详解',
char: '单字详解',
strokes: '笔画数理详解',
sixdim: '六维格局详解',
gua: '周易卦象详解',
lucky: '开运锦囊详解',
poem: '诗词出处详解',
lifespan: '人生运程详解',
master: '大师寄语详解'
};
const modalTitle = computed(() => modalTitles[currentModal.value] || '详情');
const openModal = (modalType: string) => {
currentModal.value = modalType;
showModal.value = true;
};
const closeModal = () => {
showModal.value = false;
currentModal.value = '';
};
// 单字详解
const charDetails = [
{
char: "云",
element: "水",
stroke: "4画",
tone: "yún (阳平)",
desc: "意境高远,象征自由、纯洁。云卷云舒,去留无意,寓意人生境界开阔。"
},
{
char: "帆",
element: "木",
stroke: "6画",
tone: "fān (阴平)",
desc: "借风之力,行船致远。寓意事业顺利,有贵人相助,能够乘势而上。"
}
];
// 五行能量
// const wuxingData = [
// { label: "金", value: 10, color: "#E0E0E0" },
// { label: "木", value: 40, color: "#4CAF50" },
// { label: "水", value: 30, color: "#2196F3" },
// { label: "火", value: 15, color: "#F44336" },
// { label: "土", value: 5, color: "#795548" }
// ];
// 开运锦囊
const luckyItems = [
{ icon: "🎨", label: "幸运色", value: "青、蓝、黑", colorClass: "lucky-icon-blue" },
{ icon: "#", label: "幸运数", value: "1, 3, 6, 8", colorClass: "lucky-icon-pink" },
{ icon: "📍", label: "吉位", value: "东方、北方", colorClass: "lucky-icon-green" },
{ icon: "⭐", label: "贵人", value: "双鱼、巨蟹", colorClass: "lucky-icon-yellow" }
];
// 人生运程
const lifespanData = [
{ age: "少年", desc: "聪慧过人,学业优异", colorClass: "lifespan-green" },
{ age: "青年", desc: "初露锋芒,贵人提携", colorClass: "lifespan-yellow" },
{ age: "中年", desc: "事业有成,名利双收", colorClass: "lifespan-red" },
{ age: "晚年", desc: "德高望重,福寿绵长", colorClass: "lifespan-blue" }
];
const setWuxingColor = (element: WuxingElement) => {
const color = getWuxingColor(element, 'lightColor');
return `background: ${color}; color: #fff;`;
}
const setWuxingColorText = (element: WuxingElement) => {
const color = getWuxingColor(element, 'lightColor');
return `color: ${color};`;
}
// 设置三才配置圆圈的样式(背景色、边框色、文字色、阴影)
const setWuxingCircleStyle = (element: WuxingElement) => {
const config = WUXING_COLORS[element];
const color = config.color;
const rgb = config.rgb || { r: 0, g: 0, b: 0 };
return {
backgroundColor: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.1)`,
borderColor: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`,
color: color,
boxShadow: `0 0 20rpx rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.2)`
};
}
// 六维格局数据
const sixDimLabels = ['事业', '财运', '健康', '家庭', '社交', '智慧'];
const sixDimValues = [100, 100, 100, 100, 100, 100];
const sixDimRemark = '此名天格人格地格配置上佳,主事业运亨通。水木相生,智慧超群,唯需注意社交圆融。';
</script>
<style scoped>
/* Result Stage */
.analysis-result {
height: 100vh;
display: flex;
flex-direction: column;
position: relative;
z-index: 10;
font-family: SimSun, "Songti SC", "Songti TC", "Noto Serif SC", STSong, serif;
color: #e2e2e2;
overflow: hidden;
padding: 32rpx;
}
.status-bar-placeholder {
height: var(--status-bar-height, 0);
width: 100%;
flex-shrink: 0;
}
/* Header */
.analysis-header {
padding: 16rpx 32rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
background: rgba(10, 10, 15, 0.8);
backdrop-filter: blur(8px);
}
.analysis-header-btn {
display: flex;
align-items: center;
gap: 8rpx;
color: #a0a0a0;
background: none;
border: none;
padding: 16rpx 0;
font-size: 24rpx;
letter-spacing: 0.2em;
}
.analysis-header-arrow {
font-size: 36rpx;
font-weight: 300;
}
.analysis-header-title {
font-size: 32rpx;
font-weight: bold;
letter-spacing: 0.3em;
color: #d4af37;
text-shadow: 0 0 10rpx rgba(212, 175, 55, 0.3);
}
.analysis-header-share {
color: #d4af37;
font-size: 36rpx;
}
/* Content */
.analysis-content {
flex: 1;
height: 0;
padding-bottom: 160rpx;
}
/* Score Card */
.score-card {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 48rpx;
text-align: center;
border-radius: 4rpx;
position: relative;
overflow: hidden;
margin-bottom: 64rpx;
}
.score-card-corner {
position: absolute;
width: 16rpx;
height: 16rpx;
border-color: #d4af37;
border-style: solid;
}
.score-card-corner-tl {
top: 6px;
left: 6px;
border-width: 1px 0 0 1px;
}
.score-card-corner-tr {
top: 6px;
right: 6px;
border-width: 1px 1px 0 0;
}
.score-card-corner-bl {
bottom: 6px;
left: 6px;
border-width: 0 0 1px 1px;
}
.score-card-corner-br {
bottom: 6px;
right: 6px;
border-width: 0 1px 1px 0;
}
.score-card-content {
display: flex;
flex-direction: column;
align-items: center;
}
.score-card-label {
font-size: 20rpx;
color: #d4af37;
letter-spacing: 0.5em;
margin-bottom: 16rpx;
text-transform: uppercase;
opacity: 0.8;
}
.score-card-rotation {
position: relative;
width: 200rpx;
height: 200rpx;
display: flex;
align-items: center;
justify-content: center;
}
.score-card-ring {
position: absolute;
inset: 0;
border: 1px dashed #d4af37;
border-radius: 50%;
background: transparent;
animation: rotate 10s linear infinite;
}
.score-card-rotation-text {
position: relative;
font-size: 120rpx;
font-weight: bold;
color: #d4af37;
text-shadow: 0 0 18rpx rgba(212, 175, 55, 0.5);
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.score-card-stars {
display: flex;
gap: 8rpx;
margin-top: 24rpx;
margin-bottom: 32rpx;
}
.score-card-star {
font-size: 20rpx;
color: #5a5a5a;
}
.score-card-star.filled {
color: #d4af37;
}
.score-card-divider {
width: 100%;
height: 1px;
background: linear-gradient(to right, transparent, rgba(212, 175, 55, 0.3), transparent);
margin: 16rpx 0;
}
.score-card-name {
font-size: 48rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 0.5em;
margin-top: 16rpx;
margin-bottom: 8rpx;
}
.score-card-poem {
font-size: 24rpx;
color: #a0a0a0;
font-style: italic;
}
/* Section */
.section {
margin-bottom: 64rpx;
}
.section-title {
display: flex;
align-items: center;
gap: 16rpx;
margin-bottom: 32rpx;
padding: 0 8rpx;
}
.section-title-icon {
font-size: 28rpx;
}
.section-title-icon-svg {
width: 30rpx;
height: 30rpx;
display: block;
color: #e2e2e2;
flex: 0 0 auto;
}
.section-title-text {
font-size: 28rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 0.3em;
}
.section-subtitle {
font-size: 20rpx;
color: #a0a0a0;
margin-bottom: 24rpx;
padding: 0 8rpx;
display: block;
}
/* Meaning Card */
.meaning-card {
background: #1a1a2e;
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 32rpx;
border-radius: 16rpx;
position: relative;
overflow: hidden;
margin-bottom: 32rpx;
}
.meaning-card-quote {
position: absolute;
right: 0;
top: 0;
opacity: 0.1;
color: #d4af37;
font-size: 80rpx;
}
.meaning-card-title {
font-size: 24rpx;
font-weight: bold;
color: #d4af37;
margin-bottom: 16rpx;
display: block;
}
.meaning-card-text {
font-size: 24rpx;
color: #a0a0a0;
line-height: 1.75;
text-align: justify;
display: block;
}
.highlight {
color: #e2e2e2;
font-weight: bold;
}
.meaning-card-judge {
color: #d4af37;
display: inline;
}
/* Zodiac Card */
.zodiac-card {
background: linear-gradient(to right, #16213e, #1a1a2e);
padding: 32rpx;
border-radius: 16rpx;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.zodiac-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
}
.zodiac-card-left {
display: flex;
align-items: center;
gap: 16rpx;
}
.zodiac-icon {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
background: rgba(212, 175, 55, 0.2);
display: flex;
align-items: center;
justify-content: center;
font-size: 36rpx;
}
.zodiac-info {
display: flex;
flex-direction: column;
}
.zodiac-label {
font-size: 24rpx;
color: #a0a0a0;
}
.zodiac-value {
font-size: 28rpx;
font-weight: bold;
color: #e2e2e2;
margin: 10px 0px;
}
.zodiac-score {
font-size: 40rpx;
font-weight: bold;
color: #d4af37;
}
.zodiac-items {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.zodiac-item {
display: flex;
align-items: flex-start;
gap: 24rpx;
}
.zodiac-dot {
width: 12rpx;
height: 12rpx;
border-radius: 50%;
background: #4caf50;
margin-top: 12rpx;
flex-shrink: 0;
}
.zodiac-text {
font-size: 24rpx;
color: #a0a0a0;
line-height: 1.67;
flex: 1;
}
.zodiac-char {
color: #e2e2e2;
font-weight: bold;
}
/* Char List */
.char-list {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.char-item {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 32rpx;
border-radius: 16rpx;
display: flex;
align-items: flex-start;
gap: 32rpx;
}
.char-item-left {
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
}
.char-box {
width: 96rpx;
height: 96rpx;
background: #0a0a0f;
border: 1px solid rgba(212, 175, 55, 0.3);
color: #e2e2e2;
display: flex;
align-items: center;
justify-content: center;
font-size: 48rpx;
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5);
}
.char-element {
font-size: 20rpx;
padding: 4rpx 12rpx;
border-radius: 4rpx;
background: rgba(33, 150, 243, 0.2);
border: 1px solid rgba(33, 150, 243, 0.3);
color: #90caf9;
}
.char-item-right {
flex: 1;
}
.char-item-meta {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16rpx;
padding-bottom: 16rpx;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.char-meta-label {
font-size: 24rpx;
color: #a0a0a0;
}
.char-meta-value {
color: #e2e2e2;
}
.char-desc {
font-size: 24rpx;
color: #a0a0a0;
line-height: 1.75;
text-align: justify;
}
/* Strokes Display */
.strokes-display {
display: flex;
justify-content: center;
align-items: center;
gap: 48rpx;
padding: 32rpx;
background: rgba(255, 255, 255, 0.05);
border-radius: 16rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
margin-bottom: 48rpx;
}
.stroke-item {
text-align: center;
}
.stroke-box {
width: 96rpx;
height: 96rpx;
border-radius: 16rpx;
background: #0a0a0f;
border: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 48rpx;
color: #e2e2e2;
margin-bottom: 8rpx;
}
.stroke-box-active {
border-color: rgba(212, 175, 55, 0.3);
color: #d4af37;
}
.stroke-line {
width: 32rpx;
height: 1px;
background: rgba(255, 255, 255, 0.2);
}
.stroke-label {
font-size: 20rpx;
color: #a0a0a0;
}
/* Wu Ge List */
.wuge-list {
display: flex;
flex-direction: column;
gap: 24rpx;
margin-bottom: 32rpx;
}
.wuge-item {
background: rgba(255, 255, 255, 0.05);
padding: 24rpx;
border-radius: 8rpx;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
}
.wuge-item-highlight {
background: rgba(212, 175, 55, 0.1);
border: 1px solid rgba(212, 175, 55, 0.3);
}
.wuge-item-red {
background: rgba(156, 42, 42, 0.1);
border: 1px solid rgba(156, 42, 42, 0.3);
}
.wuge-indicator {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4rpx;
background: #d4af37;
}
.wuge-item-left {
flex: 1;
}
.wuge-name {
font-size: 24rpx;
font-weight: bold;
color: #e2e2e2;
display: block;
}
.wuge-name-highlight {
color: #d4af37;
}
.wuge-desc {
font-size: 20rpx;
color: #a0a0a0;
opacity: 0.8;
}
.wuge-desc-highlight {
color: #e2e2e2;
}
.wuge-bar {
width: 128rpx;
height: 12rpx;
background: rgba(255, 255, 255, 0.1);
border-radius: 999rpx;
overflow: hidden;
}
.wuge-bar-fill {
height: 100%;
background: #fbc02d;
border-radius: 999rpx;
}
.wuge-bar-fill-highlight {
background: #d4af37;
}
.wuge-bar-fill-blue {
background: #42a5f5;
}
.wuge-bar-fill-red {
background: #9c2a2a;
}
/* Grid 2 */
.grid-2 {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32rpx;
}
/* San Cai Card */
.sancai-card {
background: rgba(255, 255, 255, 0.05);
padding: 32rpx;
border-radius: 16rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.sancai-title {
font-size: 24rpx;
color: #d4af37;
font-weight: bold;
letter-spacing: 0.2em;
margin-bottom: 24rpx;
padding-left: 16rpx;
border-left: 2px solid #d4af37;
display: block;
}
.sancai-circles {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 8rpx;
margin-bottom: 24rpx;
}
.sancai-circle {
display: flex;
flex-direction: column;
align-items: center;
gap: 8rpx;
}
.sancai-circle-small {
width: 64rpx;
height: 64rpx;
}
.sancai-circle-large {
width: 80rpx;
height: 80rpx;
}
.sancai-circle-text {
width: 50rpx;
height: 50rpx;
border-radius: 50%;
border: 1px solid rgba(76, 175, 80, 0.5);
background: rgba(76, 175, 80, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
font-weight: bold;
color: #4caf50;
box-shadow: 0 0 20rpx rgba(76, 175, 80, 0.2);
}
.sancai-circle-label {
font-size: 20rpx;
color: #a0a0a0;
}
.sancai-line {
width: 48rpx;
height: 1px;
background: rgba(255, 255, 255, 0.1);
}
.sancai-result {
font-size: 20rpx;
color: #e2e2e2;
text-align: center;
background: rgba(255, 255, 255, 0.05);
padding: 12rpx 0;
border-radius: 8rpx;
}
.sancai-label {
color: #d4af37;
font-weight: bold;
}
/* Wu Xing Card */
.wuxing-card {
background: rgba(255, 255, 255, 0.05);
padding: 32rpx;
border-radius: 16rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.wuxing-title {
font-size: 24rpx;
color: #d4af37;
font-weight: bold;
letter-spacing: 0.2em;
margin-bottom: 24rpx;
padding-left: 16rpx;
border-left: 2px solid #d4af37;
display: block;
}
.wuxing-bars {
display: flex;
flex-direction: column;
gap: 16rpx;
margin-bottom: 24rpx;
}
.wuxing-bar-item {
display: flex;
align-items: center;
gap: 24rpx;
}
.wuxing-bar-label {
width: 40rpx;
color: #a0a0a0;
font-size: 24rpx;
}
.wuxing-bar-bg {
flex: 1;
height: 12rpx;
background: rgba(255, 255, 255, 0.1);
border-radius: 999rpx;
overflow: hidden;
}
.wuxing-bar-fill {
height: 100%;
border-radius: 999rpx;
box-shadow: 0 0 8rpx currentColor;
}
.wuxing-bar-value {
width: 64rpx;
text-align: right;
color: #e2e2e2;
font-size: 24rpx;
font-family: monospace;
}
.wuxing-note {
font-size: 20rpx;
color: #a0a0a0;
opacity: 0.7;
line-height: 1.67;
}
/* Gua Card */
.gua-card {
background: linear-gradient(to right, #16213e, #1a1a2e);
padding: 40rpx;
border-radius: 16rpx;
border: 1px solid rgba(212, 175, 55, 0.3);
display: flex;
align-items: center;
gap: 48rpx;
position: relative;
overflow: hidden;
}
.gua-bg {
position: absolute;
right: -40rpx;
top: -40rpx;
font-size: 200rpx;
color: rgba(255, 255, 255, 0.05);
pointer-events: none;
}
.gua-lines {
display: flex;
flex-direction: column;
gap: 12rpx;
width: 112rpx;
flex-shrink: 0;
position: relative;
z-index: 10;
}
.gua-line {
width: 100%;
height: 12rpx;
display: flex;
justify-content: space-between;
}
.gua-line-solid {
background: #d4af37;
box-shadow: 0 0 8rpx #d4af37;
}
.gua-line-broken {
display: flex;
justify-content: space-between;
}
.gua-line-part {
width: 45%;
height: 100%;
background: rgba(212, 175, 55, 0.5);
}
.gua-line-gray .gua-line-part {
background: rgba(160, 160, 160, 0.5);
}
.gua-line-white {
background: #e2e2e2;
}
.gua-space {
height: 8rpx;
}
.gua-content {
flex: 1;
position: relative;
z-index: 10;
}
.gua-header {
display: flex;
align-items: baseline;
gap: 24rpx;
margin-bottom: 16rpx;
}
.gua-name {
font-size: 40rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 0.3em;
}
.gua-tag {
font-size: 20rpx;
color: #9c2a2a;
border: 1px solid #9c2a2a;
padding: 4rpx 8rpx;
border-radius: 4rpx;
}
.gua-desc {
font-size: 24rpx;
color: #a0a0a0;
line-height: 1.75;
text-align: justify;
}
/* Lucky Grid */
.lucky-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24rpx;
margin-bottom: 64rpx;
}
.lucky-item {
background: rgba(255, 255, 255, 0.05);
padding: 24rpx;
border-radius: 8rpx;
display: flex;
align-items: center;
gap: 24rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
transition: border-color 0.3s;
}
.lucky-icon {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
.lucky-icon-blue {
color: #42a5f5;
}
.lucky-icon-pink {
color: #ec407a;
}
.lucky-icon-green {
color: #66bb6a;
}
.lucky-icon-yellow {
color: #ffee58;
}
.lucky-info {
flex: 1;
}
.lucky-label {
font-size: 20rpx;
color: #a0a0a0;
display: block;
}
.lucky-value {
font-size: 24rpx;
font-weight: bold;
color: #e2e2e2;
display: block;
}
/* Poem Card */
.poem-card {
background: rgba(226, 226, 226, 0.05);
padding: 40rpx;
border-radius: 16rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
position: relative;
overflow: hidden;
margin-bottom: 64rpx;
}
.poem-quote {
position: absolute;
top: -16rpx;
left: -16rpx;
opacity: 0.05;
color: white;
font-size: 120rpx;
transform: rotate(180deg);
}
.poem-text {
font-size: 28rpx;
color: #e2e2e2;
font-style: italic;
line-height: 1.75;
text-align: center;
display: block;
margin-bottom: 8rpx;
}
.poem-highlight {
color: #d4af37;
margin: 0 8rpx;
}
.poem-author {
font-size: 20rpx;
color: #a0a0a0;
text-align: right;
display: block;
margin-top: 8rpx;
}
/* Lifespan Scroll */
.lifespan-scroll {
width: 100%;
white-space: nowrap;
}
.lifespan-row {
display: inline-flex;
gap: 24rpx;
padding-bottom: 32rpx;
padding-left: 8rpx;
padding-right: 8rpx;
}
.lifespan-item {
min-width: 240rpx;
padding: 32rpx;
border-radius: 16rpx;
border: 1px solid;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
position: relative;
overflow: hidden;
}
.lifespan-green {
background: rgba(56, 142, 60, 0.2);
border-color: rgba(76, 175, 80, 0.3);
}
.lifespan-yellow {
background: rgba(245, 127, 23, 0.2);
border-color: rgba(255, 152, 0, 0.3);
}
.lifespan-red {
background: rgba(183, 28, 28, 0.2);
border-color: rgba(244, 67, 54, 0.3);
}
.lifespan-blue {
background: rgba(13, 71, 161, 0.2);
border-color: rgba(33, 150, 243, 0.3);
}
.lifespan-age {
font-size: 24rpx;
font-weight: bold;
color: #e2e2e2;
margin-bottom: 16rpx;
}
.lifespan-desc {
font-size: 20rpx;
color: #a0a0a0;
line-height: 1.67;
}
/* Recommend List */
.recommend-list {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.recommend-item {
background: linear-gradient(to right, rgba(255, 255, 255, 0.05), transparent);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 24rpx;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
transition: border-color 0.3s;
}
.recommend-left {
flex: 1;
}
.recommend-header {
display: flex;
align-items: center;
gap: 16rpx;
margin-bottom: 8rpx;
}
.recommend-name {
font-size: 36rpx;
font-weight: bold;
color: #e2e2e2;
transition: color 0.3s;
}
.recommend-tags {
display: flex;
gap: 8rpx;
}
.recommend-tag {
font-size: 18rpx;
padding: 4rpx 12rpx;
border-radius: 4rpx;
background: rgba(255, 255, 255, 0.05);
color: #a0a0a0;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.recommend-desc {
font-size: 20rpx;
color: #a0a0a0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.recommend-right {
display: flex;
flex-direction: column;
align-items: center;
padding-left: 24rpx;
border-left: 1px solid rgba(255, 255, 255, 0.1);
}
.recommend-score {
font-size: 24rpx;
color: #d4af37;
font-weight: bold;
}
.recommend-label {
font-size: 18rpx;
color: #a0a0a0;
}
/* Master Message */
.master-message {
background: linear-gradient(to right, #1a1a2e, #10101a);
padding: 32rpx;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
position: relative;
overflow: hidden;
border-left: 4px solid #d4af37;
border-top-right-radius: 16rpx;
border-bottom-right-radius: 16rpx;
margin-bottom: 64rpx;
}
.master-message-title {
font-size: 24rpx;
font-weight: bold;
color: #d4af37;
letter-spacing: 0.3em;
margin-bottom: 16rpx;
display: block;
}
.master-message-text {
font-size: 22rpx;
color: #a0a0a0;
line-height: 1.75;
}
/* Footer */
.footer {
text-align: center;
padding-bottom: 64rpx;
}
.footer-text {
font-size: 18rpx;
color: #5a5a5a;
}
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(4px);
z-index: 999;
display: flex;
align-items: flex-end;
justify-content: center;
}
.modal-container {
width: 100%;
max-width: 750rpx;
max-height: 80vh;
background: #0a0a0f;
border-top-left-radius: 24rpx;
border-top-right-radius: 24rpx;
border: 1px solid rgba(212, 175, 55, 0.2);
overflow: hidden;
}
.modal-header {
padding: 24rpx 32rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.modal-title {
color: #d4af37;
font-weight: bold;
letter-spacing: 0.2em;
font-size: 26rpx;
}
.modal-close {
width: 56rpx;
height: 56rpx;
display: flex;
align-items: center;
justify-content: center;
}
.modal-close-icon {
font-size: 44rpx;
color: rgba(212, 175, 55, 0.9);
line-height: 1;
}
.modal-body {
max-height: calc(80vh - 96rpx);
}
.modal-body-contain {
padding: 24rpx 32rpx 40rpx;
}
.modal-content {
display: flex;
flex-direction: column;
gap: 16rpx;
}
.modal-section-title {
color: #d4af37;
font-weight: bold;
letter-spacing: 0.2em;
font-size: 24rpx;
margin-top: 8rpx;
}
.modal-text {
color: #a0a0a0;
font-size: 24rpx;
line-height: 1.75;
}
.modal-char-list {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.modal-char-item {
padding: 24rpx;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 16rpx;
background: rgba(255, 255, 255, 0.03);
}
.modal-char-title {
color: #e2e2e2;
font-size: 28rpx;
font-weight: bold;
letter-spacing: 0.2em;
}
.modal-list {
display: flex;
flex-direction: column;
gap: 10rpx;
}
</style>