Files
anxinyan/design-prototypes/anxinyan-user-ui-overview-v1.html
wushumin edd1a02157 first
2026-05-11 15:28:27 +08:00

1402 lines
43 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>安心验 · 用户端 UI 探索 V1</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600;700&family=Noto+Sans+SC:wght@400;500;600;700&display=swap" rel="stylesheet" />
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<style>
:root {
--ink-strong: #191815;
--ink: #2e2a24;
--ink-soft: #666055;
--paper: #f5f1e8;
--paper-strong: #efe7d9;
--card: rgba(255, 252, 246, 0.92);
--line: rgba(114, 101, 77, 0.14);
--gold: #d0aa3d;
--gold-deep: #a8801b;
--gold-soft: rgba(208, 170, 61, 0.18);
--success: #305d4f;
--warning: #9a5c24;
--shadow-xl: 0 36px 96px rgba(52, 39, 17, 0.14);
--shadow-lg: 0 18px 50px rgba(40, 29, 13, 0.12);
--radius-xl: 30px;
--radius-lg: 24px;
--radius-md: 18px;
--radius-pill: 999px;
}
* {
box-sizing: border-box;
}
html, body {
margin: 0;
min-height: 100%;
background:
radial-gradient(circle at top left, rgba(208, 170, 61, 0.16), transparent 25%),
radial-gradient(circle at bottom right, rgba(25, 24, 21, 0.08), transparent 22%),
linear-gradient(180deg, #faf7f1 0%, #f3ede1 100%);
color: var(--ink);
font-family: "Noto Sans SC", -apple-system, BlinkMacSystemFont, sans-serif;
}
body {
padding: 42px;
}
#root {
max-width: 1680px;
margin: 0 auto;
}
.prototype-shell {
display: grid;
gap: 28px;
}
.intro-panel {
display: grid;
grid-template-columns: 1.2fr 0.8fr;
gap: 24px;
padding: 30px;
border-radius: 34px;
background: rgba(255, 253, 248, 0.78);
border: 1px solid rgba(194, 176, 142, 0.28);
box-shadow: var(--shadow-lg);
backdrop-filter: blur(12px);
}
.intro-main {
display: grid;
gap: 16px;
}
.intro-kicker {
display: inline-flex;
width: fit-content;
align-items: center;
gap: 10px;
padding: 10px 16px;
border-radius: var(--radius-pill);
background: rgba(255, 255, 255, 0.68);
color: var(--ink-soft);
font-size: 13px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.intro-title {
margin: 0;
font-family: "Cormorant Garamond", serif;
font-size: 58px;
line-height: 0.94;
color: var(--ink-strong);
font-weight: 700;
letter-spacing: -0.03em;
}
.intro-desc {
margin: 0;
color: var(--ink-soft);
font-size: 18px;
line-height: 1.9;
max-width: 760px;
}
.intro-tags {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.intro-tag {
padding: 10px 15px;
border-radius: var(--radius-pill);
background: var(--gold-soft);
color: var(--gold-deep);
font-size: 14px;
font-weight: 600;
}
.intro-note {
padding: 22px;
border-radius: 28px;
background:
linear-gradient(160deg, rgba(28, 27, 24, 0.98) 0%, rgba(50, 41, 28, 0.98) 100%);
color: rgba(255, 248, 234, 0.92);
display: grid;
gap: 18px;
min-height: 100%;
}
.brand-card {
display: flex;
align-items: center;
justify-content: center;
min-height: 124px;
padding: 16px;
border-radius: 24px;
background: rgba(255, 255, 255, 0.88);
}
.brand-card img {
max-width: 100%;
max-height: 92px;
object-fit: contain;
border-radius: 14px;
}
.note-title {
margin: 0;
font-size: 18px;
font-weight: 700;
color: #f4d992;
}
.note-list {
display: grid;
gap: 12px;
font-size: 14px;
line-height: 1.8;
color: rgba(255, 248, 234, 0.74);
}
.device-overview {
display: grid;
gap: 22px;
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.device-column {
display: grid;
gap: 12px;
justify-items: center;
}
.device-label {
font-size: 13px;
color: var(--ink-soft);
letter-spacing: 0.06em;
text-transform: uppercase;
}
.screen-root {
min-height: 100%;
padding: 18px 18px 26px;
background:
radial-gradient(circle at top left, rgba(208, 170, 61, 0.14), transparent 28%),
linear-gradient(180deg, #fbf8f1 0%, #f3ecdf 100%);
color: var(--ink);
}
.screen-root--dark {
background:
radial-gradient(circle at top right, rgba(208, 170, 61, 0.24), transparent 28%),
linear-gradient(180deg, #181614 0%, #1f1b16 100%);
color: rgba(255, 250, 238, 0.96);
}
.mini-kicker {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 12px;
border-radius: var(--radius-pill);
background: rgba(255, 255, 255, 0.74);
color: var(--ink-soft);
font-size: 11px;
letter-spacing: 0.04em;
}
.screen-root--dark .mini-kicker {
background: rgba(255, 255, 255, 0.12);
color: rgba(255, 248, 234, 0.76);
}
.hero-card {
position: relative;
margin-top: 16px;
padding: 22px;
border-radius: 30px;
overflow: hidden;
background:
radial-gradient(circle at top right, rgba(236, 206, 123, 0.22), transparent 36%),
linear-gradient(160deg, #191815 0%, #27221c 100%);
box-shadow: 0 18px 34px rgba(26, 22, 18, 0.22);
color: #fff8ea;
}
.hero-card h2,
.hero-card h3,
.section-title,
.stat-value,
.report-title,
.order-number {
font-family: "Cormorant Garamond", serif;
}
.hero-card h2 {
margin: 14px 0 0;
font-size: 42px;
line-height: 0.98;
letter-spacing: -0.03em;
}
.hero-card p {
margin: 12px 0 0;
font-size: 14px;
line-height: 1.8;
color: rgba(255, 247, 231, 0.78);
}
.hero-actions {
display: grid;
grid-template-columns: 1fr auto;
gap: 10px;
margin-top: 18px;
}
.primary-button,
.secondary-button,
.micro-pill {
border-radius: var(--radius-pill);
font-weight: 700;
}
.primary-button {
display: flex;
justify-content: center;
align-items: center;
min-height: 46px;
background: linear-gradient(135deg, #d8b453 0%, #b88718 100%);
color: #17130d;
font-size: 14px;
box-shadow: 0 12px 24px rgba(184, 135, 24, 0.28);
}
.secondary-button {
display: flex;
justify-content: center;
align-items: center;
min-width: 116px;
min-height: 46px;
padding: 0 16px;
border: 1px solid rgba(255, 248, 234, 0.14);
background: rgba(255, 255, 255, 0.09);
color: rgba(255, 248, 234, 0.82);
font-size: 13px;
}
.metric-row {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
margin-top: 18px;
}
.metric-box {
padding: 14px 12px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.stat-value {
font-size: 30px;
line-height: 1;
color: #fff;
font-weight: 700;
}
.stat-label {
margin-top: 8px;
color: rgba(255, 247, 231, 0.68);
font-size: 11px;
line-height: 1.5;
}
.section-card {
margin-top: 14px;
padding: 16px;
border-radius: 24px;
background: var(--card);
border: 1px solid var(--line);
box-shadow: 0 10px 24px rgba(39, 30, 18, 0.05);
backdrop-filter: blur(10px);
}
.section-card--soft {
background: linear-gradient(180deg, rgba(255, 253, 248, 0.96) 0%, rgba(248, 242, 231, 0.98) 100%);
}
.section-title {
margin: 0;
font-size: 28px;
line-height: 1;
color: var(--ink-strong);
font-weight: 700;
letter-spacing: -0.02em;
}
.section-subtitle {
margin-top: 8px;
color: var(--ink-soft);
font-size: 12px;
line-height: 1.75;
}
.stack {
display: grid;
gap: 12px;
}
.service-option {
padding: 16px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.66);
border: 1px solid rgba(115, 101, 77, 0.1);
}
.service-option--selected {
background:
linear-gradient(150deg, rgba(31, 28, 24, 0.98) 0%, rgba(55, 44, 24, 0.98) 100%);
border-color: rgba(208, 170, 61, 0.4);
color: rgba(255, 247, 231, 0.92);
box-shadow: 0 18px 34px rgba(41, 30, 12, 0.2);
}
.service-tag,
.status-chip,
.detail-chip {
display: inline-flex;
align-items: center;
min-height: 28px;
padding: 0 10px;
border-radius: var(--radius-pill);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
}
.service-tag {
background: rgba(208, 170, 61, 0.14);
color: var(--gold-deep);
}
.service-option--selected .service-tag {
background: rgba(255, 248, 234, 0.14);
color: #f3d27d;
}
.service-name {
margin-top: 10px;
font-size: 22px;
font-weight: 700;
line-height: 1.3;
}
.service-desc {
margin-top: 8px;
font-size: 12px;
line-height: 1.75;
color: inherit;
opacity: 0.8;
}
.service-meta {
display: flex;
justify-content: space-between;
gap: 12px;
margin-top: 14px;
font-size: 11px;
color: inherit;
opacity: 0.72;
}
.tab-strip {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
margin-top: 16px;
padding: 8px;
border-radius: 24px;
background: rgba(255, 255, 255, 0.58);
border: 1px solid rgba(115, 101, 77, 0.08);
}
.tab-item {
display: flex;
align-items: center;
justify-content: center;
min-height: 40px;
border-radius: 16px;
color: var(--ink-soft);
font-size: 12px;
font-weight: 600;
}
.tab-item--active {
background: linear-gradient(180deg, #f0dfb2 0%, #d3ae4b 100%);
color: #1e1a14;
box-shadow: 0 8px 16px rgba(184, 135, 24, 0.18);
}
.list-card {
padding: 16px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.66);
border: 1px solid rgba(115, 101, 77, 0.08);
box-shadow: 0 8px 20px rgba(55, 44, 24, 0.05);
}
.order-number {
font-size: 28px;
line-height: 1;
color: var(--ink-strong);
font-weight: 700;
}
.order-sub {
margin-top: 6px;
color: var(--ink-soft);
font-size: 11px;
}
.list-title-row {
display: flex;
justify-content: space-between;
gap: 10px;
align-items: center;
}
.list-title {
font-size: 17px;
font-weight: 700;
line-height: 1.4;
color: var(--ink-strong);
}
.list-desc {
margin-top: 8px;
font-size: 12px;
line-height: 1.7;
color: var(--ink-soft);
}
.status-chip--warning {
background: rgba(154, 92, 36, 0.12);
color: var(--warning);
}
.status-chip--success {
background: rgba(48, 93, 79, 0.12);
color: var(--success);
}
.status-chip--info {
background: rgba(208, 170, 61, 0.14);
color: var(--gold-deep);
}
.visual-grid {
display: grid;
gap: 10px;
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.visual-cell {
min-height: 68px;
border-radius: 16px;
background:
linear-gradient(155deg, rgba(25, 24, 21, 0.86) 0%, rgba(57, 47, 29, 0.82) 100%);
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
padding: 10px;
color: rgba(255, 248, 234, 0.78);
font-size: 11px;
}
.visual-cell::after {
content: "";
position: absolute;
inset: auto -18px -18px auto;
width: 48px;
height: 48px;
border-radius: 50%;
background: rgba(208, 170, 61, 0.22);
filter: blur(4px);
}
.report-badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 16px;
background: rgba(208, 170, 61, 0.12);
color: var(--gold-deep);
font-size: 11px;
font-weight: 700;
width: fit-content;
}
.report-title {
margin: 14px 0 0;
font-size: 38px;
line-height: 0.98;
color: var(--ink-strong);
font-weight: 700;
letter-spacing: -0.03em;
}
.report-result {
margin-top: 16px;
padding: 16px;
border-radius: 22px;
background: linear-gradient(180deg, #fff 0%, #f5f0e5 100%);
border: 1px solid rgba(208, 170, 61, 0.18);
}
.result-label {
color: var(--ink-soft);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.result-value {
margin-top: 6px;
font-size: 26px;
color: var(--success);
font-weight: 800;
line-height: 1.2;
}
.result-desc {
margin-top: 8px;
font-size: 12px;
color: var(--ink-soft);
line-height: 1.7;
}
.kv-table {
display: grid;
gap: 10px;
margin-top: 14px;
}
.kv-row {
display: flex;
justify-content: space-between;
gap: 12px;
font-size: 12px;
line-height: 1.7;
}
.kv-label {
color: var(--ink-soft);
}
.kv-value {
color: var(--ink-strong);
text-align: right;
font-weight: 600;
}
.qrcode-box {
display: grid;
grid-template-columns: 92px 1fr;
gap: 14px;
margin-top: 16px;
padding: 14px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.74);
border: 1px solid rgba(115, 101, 77, 0.08);
}
.qrcode-art {
width: 92px;
height: 92px;
border-radius: 18px;
background:
linear-gradient(90deg, rgba(25, 24, 21, 0.95) 8%, transparent 8%) 0 0 / 16px 16px,
linear-gradient(rgba(25, 24, 21, 0.95) 8%, transparent 8%) 0 0 / 16px 16px,
linear-gradient(180deg, #fff 0%, #f5f2eb 100%);
border: 6px solid #fff;
box-shadow: inset 0 0 0 1px rgba(25, 24, 21, 0.08);
}
.timeline {
display: grid;
gap: 12px;
margin-top: 16px;
}
.timeline-item {
position: relative;
padding-left: 20px;
}
.timeline-item::before {
content: "";
position: absolute;
left: 0;
top: 7px;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--gold);
box-shadow: 0 0 0 4px rgba(208, 170, 61, 0.12);
}
.timeline-title {
font-size: 13px;
font-weight: 700;
color: var(--ink-strong);
}
.timeline-desc {
margin-top: 4px;
font-size: 11px;
color: var(--ink-soft);
line-height: 1.7;
}
.message-card {
padding: 14px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.66);
border: 1px solid rgba(115, 101, 77, 0.08);
}
.message-head {
display: flex;
justify-content: space-between;
gap: 12px;
align-items: center;
}
.message-title {
font-size: 14px;
font-weight: 700;
color: var(--ink-strong);
}
.message-time {
color: var(--ink-soft);
font-size: 11px;
}
.message-body {
margin-top: 8px;
color: var(--ink-soft);
font-size: 12px;
line-height: 1.75;
}
.bottom-nav {
position: absolute;
left: 14px;
right: 14px;
bottom: 4px;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
padding: 10px 12px;
border-radius: 26px;
background: rgba(255, 255, 255, 0.88);
border: 1px solid rgba(115, 101, 77, 0.08);
box-shadow: 0 8px 18px rgba(38, 28, 11, 0.08);
backdrop-filter: blur(12px);
}
.nav-item {
display: flex;
align-items: center;
justify-content: center;
min-height: 34px;
border-radius: 14px;
color: rgba(102, 96, 85, 0.92);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
}
.nav-item--active {
color: var(--ink-strong);
background: linear-gradient(135deg, #d8b453 0%, #b88718 100%);
box-shadow: 0 8px 14px rgba(184, 135, 24, 0.24);
}
.shield-mark {
width: 18px;
height: 20px;
background: linear-gradient(180deg, #e1bd58 0%, #ba8b1c 100%);
clip-path: polygon(50% 0%, 88% 14%, 88% 55%, 50% 100%, 12% 55%, 12% 14%);
position: relative;
}
.shield-mark::after {
content: "";
position: absolute;
left: 50%;
top: 26%;
transform: translateX(-50%);
width: 7px;
height: 9px;
border: 2px solid rgba(255,255,255,0.92);
border-top: none;
border-radius: 0 0 7px 7px;
}
@media (max-width: 1380px) {
.device-overview {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.intro-panel {
grid-template-columns: 1fr;
}
}
@media (max-width: 980px) {
body {
padding: 20px;
}
.device-overview {
grid-template-columns: 1fr;
}
.intro-title {
font-size: 42px;
}
}
</style>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
/*
Huashu-Design · Junior pass assumptions
1. 这是一版设计评审用高保真总览稿,不直接替换现有业务页面。
2. 先看整体视觉语言和关键屏一致性,再决定是否进入真实页面改造。
3. 本稿优先展示品牌调性、履约秩序感、报告凭证感,图片与商品素材使用诚实 placeholder。
4. 输出形态选择 overview 平铺,而不是单流程 click demo便于一次看清 6 个核心屏。
*/
const iosFrameStyles = {
wrapper: {
display: "inline-block",
padding: 12,
background: "#000",
borderRadius: 60,
boxShadow: "0 0 0 2px #1f2937, 0 20px 60px rgba(0,0,0,0.3)",
position: "relative",
},
screen: {
position: "relative",
borderRadius: 48,
overflow: "hidden",
background: "#fff",
},
statusBar: {
position: "absolute",
top: 0,
left: 0,
right: 0,
height: 54,
display: "flex",
alignItems: "center",
justifyContent: "space-between",
padding: "0 32px 0 32px",
fontSize: 16,
fontWeight: 600,
fontFamily: '-apple-system, "SF Pro Text", sans-serif',
zIndex: 20,
pointerEvents: "none",
},
dynamicIsland: {
position: "absolute",
top: 12,
left: "50%",
transform: "translateX(-50%)",
width: 124,
height: 36,
background: "#000",
borderRadius: 999,
zIndex: 30,
},
statusIcons: {
display: "flex",
alignItems: "center",
gap: 6,
},
signalIcon: {
display: "flex",
alignItems: "flex-end",
gap: 2,
height: 12,
},
signalBar: {
width: 3,
background: "currentColor",
borderRadius: 1,
},
batteryIcon: {
width: 26,
height: 12,
border: "1.5px solid currentColor",
borderRadius: 3,
padding: 1,
position: "relative",
opacity: 0.8,
},
batteryCap: {
position: "absolute",
top: 3,
right: -3,
width: 2,
height: 6,
background: "currentColor",
borderRadius: "0 1px 1px 0",
},
content: {
position: "absolute",
top: 54,
left: 0,
right: 0,
bottom: 34,
overflow: "auto",
},
homeIndicator: {
position: "absolute",
bottom: 10,
left: "50%",
transform: "translateX(-50%)",
width: 140,
height: 5,
background: "rgba(0,0,0,0.3)",
borderRadius: 999,
zIndex: 10,
},
homeIndicatorDark: {
background: "rgba(255,255,255,0.5)",
},
};
function IosFrame({
children,
width = 393,
height = 852,
time = "9:41",
battery = 85,
darkMode = false,
showStatusBar = true,
showDynamicIsland = true,
showHomeIndicator = true,
}) {
const textColor = darkMode ? "#fff" : "#000";
return (
<div style={iosFrameStyles.wrapper}>
<div
style={{
...iosFrameStyles.screen,
width,
height,
background: darkMode ? "#000" : "#fff",
}}
>
{showStatusBar && (
<div style={{ ...iosFrameStyles.statusBar, color: textColor }}>
<span>{time}</span>
<div style={iosFrameStyles.statusIcons}>
<div style={iosFrameStyles.signalIcon}>
<div style={{ ...iosFrameStyles.signalBar, height: 4 }} />
<div style={{ ...iosFrameStyles.signalBar, height: 6 }} />
<div style={{ ...iosFrameStyles.signalBar, height: 9 }} />
<div style={{ ...iosFrameStyles.signalBar, height: 11 }} />
</div>
<svg width="16" height="12" viewBox="0 0 16 12" fill="none" style={{ color: textColor }}>
<path d="M8 11.5a1 1 0 100-2 1 1 0 000 2z" fill="currentColor" />
<path d="M3 7.5a7 7 0 0110 0" stroke="currentColor" strokeWidth="1.3" fill="none" strokeLinecap="round" />
<path d="M1 4.5a11 11 0 0114 0" stroke="currentColor" strokeWidth="1.3" fill="none" strokeLinecap="round" opacity="0.7" />
</svg>
<div style={iosFrameStyles.batteryIcon}>
<div
style={{
width: `${battery}%`,
height: "100%",
background: "currentColor",
borderRadius: 1,
opacity: 0.9,
}}
/>
<div style={iosFrameStyles.batteryCap} />
</div>
</div>
</div>
)}
{showDynamicIsland && <div style={iosFrameStyles.dynamicIsland} />}
<div style={iosFrameStyles.content}>{children}</div>
{showHomeIndicator && (
<div
style={{
...iosFrameStyles.homeIndicator,
...(darkMode ? iosFrameStyles.homeIndicatorDark : {}),
}}
/>
)}
</div>
</div>
);
}
function NavBar({ active }) {
const items = ["首页", "订单", "报告", "我的"];
return (
<div className="bottom-nav">
{items.map((item) => (
<div key={item} className={`nav-item ${active === item ? "nav-item--active" : ""}`}>
<div>{item}</div>
</div>
))}
</div>
);
}
function HomeScreen() {
return (
<div className="screen-root">
<div className="mini-kicker">
<div className="shield-mark" />
<span>安心验 · 鉴证收藏级服务</span>
</div>
<div className="hero-card">
<div className="service-tag">独立第三方 · 黑金识别</div>
<h2>信任做成<br />可验证的体验</h2>
<p>不是普通电商式下单而是让用户感到这是一家能出具凭证能解释流程能给出结果责任感的鉴证服务</p>
<div className="hero-actions">
<div className="primary-button">立即发起鉴定</div>
<div className="secondary-button">服务说明</div>
</div>
<div className="metric-row">
<div className="metric-box">
<div className="stat-value">48h</div>
<div className="stat-label">标准结果时效</div>
</div>
<div className="metric-box">
<div className="stat-value">100%</div>
<div className="stat-label">正式报告可验真</div>
</div>
<div className="metric-box">
<div className="stat-value">12.8k</div>
<div className="stat-label">累计鉴定申请</div>
</div>
</div>
</div>
<div className="section-card section-card--soft">
<div className="section-title">选择鉴定服务</div>
<div className="section-subtitle">这版首页把服务入口做成收藏卡片感而不是普通列表视觉上更像凭证和服务券</div>
<div className="stack" style={{ marginTop: 14 }}>
<div className="service-option service-option--selected">
<div className="service-tag">标准服务</div>
<div className="service-name">实物鉴定</div>
<div className="service-desc">适合正式结果交付场景强调清晰流程寄送履约与报告可验真</div>
<div className="service-meta">
<span>预计 48 小时</span>
<span>进入</span>
</div>
</div>
<div className="service-option">
<div className="service-tag">更高规格机构</div>
<div className="service-name">中检鉴定</div>
<div className="service-desc">同流程但机构规格更高价格与时效也会相应变化</div>
<div className="service-meta">
<span>机构差异化交付</span>
<span>进入</span>
</div>
</div>
</div>
</div>
<NavBar active="首页" />
</div>
);
}
function ServiceScreen() {
return (
<div className="screen-root">
<div className="mini-kicker">步骤 1 / 6 · 选择鉴定服务</div>
<div className="section-card section-card--soft" style={{ marginTop: 16 }}>
<div className="section-title">先选服务再进入商品信息</div>
<div className="section-subtitle">服务页不再只是参数比较而是让用户理解出具机构差异这件事</div>
</div>
<div className="stack" style={{ marginTop: 16 }}>
<div className="service-option service-option--selected">
<div className="service-tag">当前推荐</div>
<div className="service-name">实物鉴定</div>
<div className="service-desc">安心验标准服务适合正式结果交付强调速度稳妥与流程透明</div>
<div className="service-meta">
<span>¥99 </span>
<span>预计 48 小时</span>
</div>
</div>
<div className="service-option">
<div className="service-tag">更高规格</div>
<div className="service-name">中检鉴定</div>
<div className="service-desc">更高规格合作机构出具鉴定结果更适合高要求使用场景</div>
<div className="service-meta">
<span>¥199 </span>
<span>时效略长</span>
</div>
</div>
</div>
<div className="section-card">
<div className="section-title">对比说明</div>
<div className="kv-table">
<div className="kv-row"><span className="kv-label">流程</span><span className="kv-value"></span></div>
<div className="kv-row"><span className="kv-label">出具机构</span><span className="kv-value">安心验 / 中检机构</span></div>
<div className="kv-row"><span className="kv-label">适合场景</span><span className="kv-value">标准交付 / 更高要求</span></div>
</div>
</div>
<div className="primary-button" style={{ marginTop: 16 }}>下一步 · 进入商品信息</div>
</div>
);
}
function OrdersScreen() {
return (
<div className="screen-root">
<div className="hero-card">
<div className="service-tag">订单履约</div>
<h3 style={{ margin: "12px 0 0", fontSize: 36, lineHeight: 1 }}>每一笔订单<br />都像在走一条履约轨道</h3>
<p>把订单看板从列表提升成履约状态中心让用户第一眼知道现在需要做什么而不是自己猜</p>
<div className="metric-row">
<div className="metric-box">
<div className="stat-value">1</div>
<div className="stat-label">待补资料</div>
</div>
<div className="metric-box">
<div className="stat-value">2</div>
<div className="stat-label">进行中</div>
</div>
<div className="metric-box">
<div className="stat-value">3</div>
<div className="stat-label">已完成</div>
</div>
</div>
</div>
<div className="stack" style={{ marginTop: 16 }}>
<div className="list-card">
<div className="list-title-row">
<div>
<div className="list-title">Louis Vuitton Neverfull MM</div>
<div className="order-sub">AXY20260423******</div>
</div>
<div className="status-chip status-chip--warning">待补资料</div>
</div>
<div className="list-desc">鉴定师需要补充编码近照与五金细节建议优先处理避免订单继续停滞</div>
</div>
<div className="list-card">
<div className="list-title-row">
<div>
<div className="list-title">Cartier Santos</div>
<div className="order-sub">AXY20260422******</div>
</div>
<div className="status-chip status-chip--info">进行中</div>
</div>
<div className="list-desc">商品已签收当前进入专业判断与复核流程后续节点会持续同步</div>
</div>
<div className="list-card">
<div className="list-title-row">
<div>
<div className="list-title">Chanel CF 25</div>
<div className="order-sub">AXY20260421******</div>
</div>
<div className="status-chip status-chip--success">待寄回</div>
</div>
<div className="list-desc">正式报告已生成平台将按已确认地址安排回寄您可继续关注物流节点</div>
</div>
</div>
<NavBar active="订单" />
</div>
);
}
function OrderDetailScreen() {
return (
<div className="screen-root">
<div className="section-card section-card--soft">
<div className="status-chip status-chip--info">鉴定中心已收货</div>
<div className="section-title" style={{ marginTop: 12 }}>订单详情</div>
<div className="section-subtitle">这版详情页把下一步做成一张焦点卡避免用户在大量信息里迷路</div>
<div className="section-card" style={{ marginTop: 14, background: "rgba(25,24,21,0.96)", color: "#fff7e8", borderColor: "rgba(208,170,61,0.18)" }}>
<div style={{ color: "#f1d27e", fontSize: 11, letterSpacing: "0.08em", textTransform: "uppercase" }}>当前建议动作</div>
<div style={{ marginTop: 8, fontSize: 18, fontWeight: 700 }}>等待专业鉴定与复核</div>
<div style={{ marginTop: 8, fontSize: 12, lineHeight: 1.8, color: "rgba(255,248,234,0.76)" }}>
商品已签收后续如需补资料生成报告或安排回寄都会在本页和消息中心同步提醒
</div>
</div>
</div>
<div className="section-card">
<div className="section-title">商品与资料</div>
<div className="section-subtitle">把商品信息和资料回看拆成两个层级不再互相打架</div>
<div className="kv-table">
<div className="kv-row"><span className="kv-label">品类 / 品牌</span><span className="kv-value">奢侈品箱包 / Louis Vuitton</span></div>
<div className="kv-row"><span className="kv-label">型号 / 规格</span><span className="kv-value">Neverfull MM / 42</span></div>
<div className="kv-row"><span className="kv-label">购买渠道</span><span className="kv-value"></span></div>
<div className="kv-row"><span className="kv-label">使用情况</span><span className="kv-value">使</span></div>
</div>
<div className="visual-grid" style={{ marginTop: 14 }}>
<div className="visual-cell">正面整体图</div>
<div className="visual-cell">编码近照</div>
<div className="visual-cell">五金细节</div>
</div>
</div>
<div className="section-card">
<div className="section-title">处理记录</div>
<div className="timeline">
<div className="timeline-item">
<div className="timeline-title">鉴定中心已收货</div>
<div className="timeline-desc">2026-04-23 15:39 · 包裹已完成签收等待鉴定师开始处理</div>
</div>
<div className="timeline-item">
<div className="timeline-title">用户已提交运单</div>
<div className="timeline-desc">顺丰速运 · 运单号 789456****</div>
</div>
<div className="timeline-item">
<div className="timeline-title">订单创建成功</div>
<div className="timeline-desc">AXY-APP-20260423-5448</div>
</div>
</div>
</div>
</div>
);
}
function ReportScreen() {
return (
<div className="screen-root">
<div className="report-badge">正式结果凭证 · 可验真</div>
<div className="report-title">鉴定报告</div>
<div className="section-subtitle">报告页被做成凭证感更强的阅读体验而不是普通信息列表</div>
<div className="report-result">
<div className="result-label">鉴定结论</div>
<div className="result-value">正品</div>
<div className="result-desc">符合正品工艺特征包身结构五金细节与编码信息均与品牌标准一致</div>
</div>
<div className="section-card">
<div className="section-title">商品摘要</div>
<div className="kv-table">
<div className="kv-row"><span className="kv-label">商品名称</span><span className="kv-value">Neverfull MM</span></div>
<div className="kv-row"><span className="kv-label">品类 / 品牌</span><span className="kv-value">箱包 / Louis Vuitton</span></div>
<div className="kv-row"><span className="kv-label">颜色 / 规格</span><span className="kv-value">白盘 / 42</span></div>
</div>
</div>
<div className="qrcode-box">
<div className="qrcode-art" />
<div>
<div className="section-title" style={{ fontSize: 24 }}>报告凭证</div>
<div className="section-subtitle" style={{ marginTop: 6 }}>AXY-R-20260423-8841<br />支持扫码或编号验真</div>
<div className="primary-button" style={{ marginTop: 12, minHeight: 40 }}>去验真</div>
</div>
</div>
<div className="section-card">
<div className="section-title">说明</div>
<div className="section-subtitle" style={{ marginTop: 10 }}>
本报告基于送检商品及当前提交资料出具若商品状态或所附资料发生变化报告结论可能不再适用
</div>
</div>
<NavBar active="报告" />
</div>
);
}
function MessageScreen() {
return (
<div className="screen-root">
<div className="section-card section-card--soft">
<div className="section-title">服务提醒与处理进度</div>
<div className="section-subtitle">
这里集中展示订单流转补资料报告出具和工单回复等关键通知减少用户在不同页面里来回找状态
</div>
<div className="tab-strip">
<div className="tab-item tab-item--active">全部</div>
<div className="tab-item">订单</div>
<div className="tab-item">报告</div>
<div className="tab-item">工单</div>
</div>
</div>
<div className="stack" style={{ marginTop: 16 }}>
<div className="message-card">
<div className="message-head">
<div className="message-title">报告已出具</div>
<div className="status-chip status-chip--success">报告</div>
</div>
<div className="message-body">您的正式报告已生成可前往报告中心查看并完成验真</div>
</div>
<div className="message-card">
<div className="message-head">
<div className="message-title">请补充鉴定资料</div>
<div className="status-chip status-chip--warning">补资料</div>
</div>
<div className="message-body">鉴定师需要您补充编码近照与五金细节图以便继续完成判断</div>
</div>
<div className="message-card">
<div className="message-head">
<div className="message-title">工单有新回复</div>
<div className="status-chip status-chip--info">工单</div>
</div>
<div className="message-body">客服已回复您的工单验真结果咨询点击查看最新进展</div>
</div>
</div>
</div>
);
}
function MineScreen() {
return (
<div className="screen-root">
<div className="hero-card">
<div className="service-tag">服务资产中心</div>
<h3 style={{ margin: "12px 0 0", fontSize: 36, lineHeight: 1 }}>我的安心验</h3>
<p>用一个更资产中心而不是功能入口的框架统一收束订单报告地址消息和设置</p>
</div>
<div className="tab-strip" style={{ gridTemplateColumns: "repeat(2, minmax(0, 1fr))", marginTop: 16 }}>
<div className="tab-item tab-item--active">账号与服务</div>
<div className="tab-item">帮助与设置</div>
</div>
<div className="stack" style={{ marginTop: 16 }}>
<div className="list-card">
<div className="list-title">我的订单</div>
<div className="list-desc">查看当前进度补图要求和寄回物流</div>
</div>
<div className="list-card">
<div className="list-title">我的报告</div>
<div className="list-desc">查看正式结果下载 PDF 并进入验真</div>
</div>
<div className="list-card">
<div className="list-title">地址管理</div>
<div className="list-desc">维护寄送收货和回寄地址减少重复填写</div>
</div>
<div className="list-card">
<div className="list-title">设置中心</div>
<div className="list-desc">账号安全通知偏好隐私说明统一维护</div>
</div>
</div>
<NavBar active="我的" />
</div>
);
}
function DeviceColumn({ label, children }) {
return (
<div className="device-column">
<div className="device-label">{label}</div>
<IosFrame>{children}</IosFrame>
</div>
);
}
function App() {
return (
<div className="prototype-shell">
<section className="intro-panel">
<div className="intro-main">
<div className="intro-kicker">
<span>Huashu-Design · User-App Hi-Fi Overview</span>
</div>
<h1 className="intro-title">安心验用户端 UI 方向稿<br />鉴证收藏级体验 V1</h1>
<p className="intro-desc">
这版不是去做一个普通小程序首页而是把用户端整体重构成一种更像
鉴定凭证服务的产品气质黑金作为识别米白作为阅读底秩序感和报告感作为核心体验锚点
</p>
<div className="intro-tags">
<span className="intro-tag">方向鉴证收藏级</span>
<span className="intro-tag">形态Overview 平铺评审稿</span>
<span className="intro-tag">风格温润纸感 + 炭黑结构 + 验证金</span>
</div>
</div>
<aside className="intro-note">
<div className="brand-card">
<img src="../logo.jpeg" alt="安心验品牌标识参考" />
</div>
<h3 className="note-title">本稿基于以下假设</h3>
<div className="note-list">
<div>1. 先看整体调性和关键屏一致性不直接改线上页面</div>
<div>2. 强化鉴定结果凭证感服务履约可信度弱化电商促销感</div>
<div>3. 当前缺少真实商品图因此资料图使用诚实 placeholder不伪造品牌素材</div>
<div>4. 如果方向对再继续做第二轮真实页面改造版或单流程可点击原型</div>
</div>
</aside>
</section>
<section className="device-overview">
<DeviceColumn label="01 · 首页">
<HomeScreen />
</DeviceColumn>
<DeviceColumn label="02 · 发起鉴定">
<ServiceScreen />
</DeviceColumn>
<DeviceColumn label="03 · 订单中心">
<OrdersScreen />
</DeviceColumn>
<DeviceColumn label="04 · 订单详情">
<OrderDetailScreen />
</DeviceColumn>
<DeviceColumn label="05 · 报告详情">
<ReportScreen />
</DeviceColumn>
<DeviceColumn label="06 · 消息 / 我的">
<div className="stack" style={{ minHeight: "100%", paddingBottom: 18 }}>
<MessageScreen />
<MineScreen />
</div>
</DeviceColumn>
</section>
</div>
);
}
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
</script>
</body>
</html>