Files
zy-client-a/0000_gb_points_temp/src/components/theme/Theme5.vue
telangpu 2fd1a741cf update
2026-04-27 16:33:26 +08:00

443 lines
10 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>
<div class="t5-t8-root">
<!-- Hero红色背景区 -->
<div class="t5-t8-hero">
<!-- 装饰 -->
<span class="t5-t8-deco t5-t8-deco-tl"></span>
<span class="t5-t8-deco t5-t8-deco-tr"></span>
<span class="t5-t8-deco t5-t8-deco-br"></span>
<span class="t5-t8-deco t5-t8-deco-ml"></span>
<span class="t5-t8-deco t5-t8-deco-mr"></span>
<span class="t5-t8-deco t5-t8-deco-bl"></span>
<span class="t5-t8-deco t5-t8-deco-sub">+</span>
<!-- 顶部 badge -->
<div class="t5-t8-badge">{{ t('theme5.carnival_hub') }}</div>
<!-- 主标题 -->
<h1 class="t5-t8-title-line1">{{ t('theme5.surprise') }}</h1>
<h1 class="t5-t8-title-line2">{{ t('theme5.gifts') }}</h1>
<p class="t5-t8-hero-sub">{{ t('theme5.claim_reward') }}</p>
<!-- 三图标行 -->
<div class="t5-t8-icons-row">
<div class="t5-t8-icon-side">🎀</div>
<div class="t5-t8-icon-center">
<div class="t5-t8-icon-ring">🎁</div>
</div>
<div class="t5-t8-icon-side">💰</div>
</div>
</div>
<!-- 白卡状态 + 数据 -->
<div class="t5-t8-card-wrap">
<div class="t5-t8-status-card">
<div class="t5-t8-status-label">{{ t('theme5.point_status') }}</div>
<div class="t5-t8-status-title">{{ t('theme5.redeem_now') }}</div>
<div class="t5-t8-status-sub">{{ t('theme5.available_worldwide') }}</div>
<div class="t5-t8-stats-grid">
<div class="t5-t8-stat t5-t8-stat-red">
<div class="t5-t8-stat-val">{{ t('theme5.free') }}</div>
<div class="t5-t8-stat-lbl">{{ t('theme5.exchange') }}</div>
</div>
<div class="t5-t8-stat t5-t8-stat-orange">
<div class="t5-t8-stat-val">950+</div>
<div class="t5-t8-stat-lbl">{{ t('theme5.free_gifts') }}</div>
</div>
<div class="t5-t8-stat t5-t8-stat-blue">
<div class="t5-t8-stat-val">10M</div>
<div class="t5-t8-stat-lbl">{{ t('theme5.active_fans') }}</div>
</div>
<div class="t5-t8-stat t5-t8-stat-green">
<div class="t5-t8-stat-val">{{ t('theme5.fast') }}</div>
<div class="t5-t8-stat-lbl">{{ t('theme5.same_day_shipping') }}</div>
</div>
</div>
</div>
</div>
<!-- 表单区域 -->
<div class="t5-t8-form-section">
<h2 class="t5-t8-form-title">{{ t('theme5.form_title') }}</h2>
<p class="t5-t8-form-sub">{{ t('theme5.form_subtitle') }}</p>
<input
class="t5-t8-input"
type="tel"
inputmode="tel"
:placeholder="t('theme5.phone_placeholder')"
:value="modelValue"
@input="$emit('update:modelValue', ($event.target as HTMLInputElement).value)"
/>
<button class="t5-t8-submit-btn" @click="$emit('submit')">
{{ t('theme5.verify_btn') }}
</button>
</div>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import type { ThemeColors } from '@/config/themes';
const { t } = useI18n();
interface Props {
modelValue: string;
colors: ThemeColors;
}
defineProps<Props>();
defineEmits<{
(e: 'update:modelValue', value: string): void;
(e: 'submit'): void;
}>();
</script>
<style scoped>
/* ── Root ── */
.t5-t8-root {
background: #f4f5f7;
min-height: 100%;
padding-bottom: 1.5rem;
font-family: inherit;
}
/* ── Hero ── */
.t5-t8-hero {
position: relative;
background: linear-gradient(175deg, #ff5a4a 0%, #f03232 55%, #e02020 100%);
padding: 2rem 1.25rem 5rem;
text-align: center;
overflow: hidden;
}
.t5-t8-deco {
position: absolute;
color: rgba(255, 220, 50, 0.6);
font-size: 16px;
pointer-events: none;
}
.t5-t8-deco-tl { top: 1.1rem; left: 1.1rem; font-size: 13px; }
.t5-t8-deco-tr { top: 0.9rem; right: 1.8rem; font-size: 18px; }
.t5-t8-deco-br { bottom: 5rem; right: 1.2rem; font-size: 11px; color: rgba(255,200,50,0.45); }
.t5-t8-deco-ml { top: 45%; left: 0.7rem; font-size: 10px; color: rgba(255,240,120,0.5); }
.t5-t8-deco-mr { top: 38%; right: 0.7rem; font-size: 12px; color: rgba(255,230,80,0.45); }
.t5-t8-deco-bl { bottom: 4.5rem; left: 1.5rem; font-size: 9px; color: rgba(255,200,80,0.4); }
.t5-t8-deco-sub { top: 2.2rem; left: 40%; font-size: 14px; color: rgba(255,255,255,0.2); }
.t5-t8-badge {
display: inline-block;
background: rgba(255, 255, 255, 0.18);
border: 1px solid rgba(255, 255, 255, 0.35);
color: #fff;
font-size: 10px;
font-weight: 800;
letter-spacing: 1.5px;
padding: 0.3rem 0.9rem;
border-radius: 20px;
margin-bottom: 1rem;
text-transform: uppercase;
}
.t5-t8-title-line1 {
font-size: 58px;
font-weight: 900;
color: #ffd95a;
line-height: 1;
margin: 0;
font-style: italic;
-webkit-text-stroke: 1.5px #c87800;
text-transform: uppercase;
text-shadow: 0 2px 12px rgba(0,0,0,0.15);
}
.t5-t8-title-line2 {
font-size: 58px;
font-weight: 900;
color: #fff;
line-height: 1;
margin: 0 0 0.5rem;
font-style: italic;
text-transform: uppercase;
text-shadow: 0 2px 12px rgba(0,0,0,0.2);
}
.t5-t8-hero-sub {
font-size: 11px;
font-weight: 700;
color: rgba(255, 255, 255, 0.85);
letter-spacing: 1px;
margin: 0 0 1.5rem;
text-transform: uppercase;
}
/* 三图标行 */
.t5-t8-icons-row {
display: flex;
align-items: flex-end;
justify-content: center;
gap: 0.75rem;
}
.t5-t8-icon-side {
width: 56px;
height: 56px;
border-radius: 16px;
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
font-size: 26px;
margin-bottom: 8px;
border: 1px solid rgba(255,255,255,0.2);
}
.t5-t8-icon-center {
width: 92px;
height: 92px;
border-radius: 50%;
border: 4px solid #ffd95a;
background: #fff;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.28), 0 0 0 6px rgba(255, 217, 90, 0.25);
}
.t5-t8-icon-ring {
font-size: 42px;
line-height: 1;
}
/* ── White card wrap ── */
.t5-t8-card-wrap {
padding: 0 1rem;
margin-top: -2rem;
position: relative;
z-index: 2;
}
.t5-t8-status-card {
background: #fff;
border-radius: 24px;
padding: 1.5rem 1.25rem 1.25rem;
box-shadow: 0 -4px 0 rgba(0,0,0,0.03), 0 8px 32px rgba(0,0,0,0.09);
text-align: center;
}
.t5-t8-status-label {
font-size: 10px;
font-weight: 700;
color: #aaa;
letter-spacing: 1.2px;
text-transform: uppercase;
margin-bottom: 0.35rem;
}
.t5-t8-status-title {
font-size: 36px;
font-weight: 900;
font-style: italic;
color: #e8231a;
line-height: 1;
margin-bottom: 0.3rem;
letter-spacing: -0.5px;
}
.t5-t8-status-sub {
font-size: 12px;
font-style: italic;
color: #bbb;
margin-bottom: 2.25rem;
}
/* 2x2 stats */
.t5-t8-stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.65rem;
}
.t5-t8-stat {
border-radius: 16px;
padding: 1rem 0.75rem;
}
.t5-t8-stat-red { background: #fff0f0; }
.t5-t8-stat-orange { background: #fff7ed; }
.t5-t8-stat-blue { background: #eff6ff; }
.t5-t8-stat-green { background: #f0fdf4; }
.t5-t8-stat-val {
font-size: 24px;
font-weight: 900;
line-height: 1;
margin-bottom: 0.2rem;
}
.t5-t8-stat-red .t5-t8-stat-val { color: #e8231a; }
.t5-t8-stat-orange .t5-t8-stat-val { color: #f59e0b; }
.t5-t8-stat-blue .t5-t8-stat-val { color: #2563eb; }
.t5-t8-stat-green .t5-t8-stat-val { color: #16a34a; }
.t5-t8-stat-lbl {
font-size: 9px;
font-weight: 700;
color: #aaa;
letter-spacing: 0.8px;
text-transform: uppercase;
}
/* ── Form Section ── */
.t5-t8-form-section {
padding: 1.5rem 1rem 0;
text-align: center;
}
.t5-t8-form-title {
font-size: 24px;
font-weight: 900;
color: #111;
margin: 0 0 0.3rem;
letter-spacing: -0.3px;
}
.t5-t8-form-sub {
font-size: 13px;
color: #999;
margin: 0 0 1.1rem;
line-height: 1.4;
}
.t5-t8-input {
width: 100%;
box-sizing: border-box;
padding: 0.95rem 1.25rem;
border: 1.5px solid #f8bfbf;
border-radius: 50px;
font-size: 15px;
font-weight: 500;
background: #ffe8e8;
color: #1a1a1a;
outline: none;
margin-bottom: 0.85rem;
text-align: center;
transition: border-color 0.2s, box-shadow 0.2s;
}
.t5-t8-input::placeholder {
color: #e07070;
font-weight: 400;
}
.t5-t8-input:focus {
border-color: #e8231a;
box-shadow: 0 0 0 3px rgba(232, 35, 26, 0.12);
background: #ffd8d8;
}
.t5-t8-submit-btn {
width: 100%;
padding: 1.05rem 1.25rem;
border: none;
border-radius: 50px;
background: linear-gradient(180deg, #ffe566 0%, #f5a800 100%);
color: #7c3a00;
font-size: 15px;
font-weight: 900;
cursor: pointer;
letter-spacing: 1px;
text-transform: uppercase;
box-shadow: 0 6px 0 #c47a00, 0 8px 20px rgba(200,120,0,0.35);
transition: all 0.15s ease;
margin-bottom: 0.85rem;
position: relative;
top: 0;
}
.t5-t8-submit-btn:hover {
box-shadow: 0 4px 0 #c47a00, 0 6px 16px rgba(200,120,0,0.35);
top: 2px;
}
.t5-t8-submit-btn:active {
box-shadow: 0 1px 0 #c47a00;
top: 5px;
}
.t5-t8-secure-text {
font-size: 11px;
font-weight: 500;
color: #bbb;
letter-spacing: 0.3px;
margin: 0 0 1.25rem;
}
/* ── Notif ── */
.t5-t8-notif-wrap {
padding: 0 1rem;
}
.t5-t8-notif {
display: flex;
align-items: center;
gap: 0.75rem;
background: #fff;
border-radius: 16px;
padding: 0.85rem 1rem;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07);
border: 1px solid rgba(232, 35, 26, 0.1);
}
.t5-t8-notif-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: #e02020;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
flex-shrink: 0;
}
.t5-t8-notif-body { flex: 1; }
.t5-t8-notif-tag {
font-size: 9px;
font-weight: 800;
color: #f59e0b;
letter-spacing: 1px;
margin-bottom: 0.15rem;
}
.t5-t8-notif-text {
font-size: 13px;
color: #333;
line-height: 1.4;
}
.t5-t8-hl {
color: #e8231a;
font-weight: 700;
}
.t5-t8-hl-reward {
color: #f59e0b;
font-weight: 700;
}
.t5-t8-notif-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #22c55e;
flex-shrink: 0;
}
</style>