Files
X-Financial/mobile/design/android-expense-splash-assets.html

725 lines
21 KiB
HTML
Raw Permalink Normal View History

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>X-Financial Expense 启动页素材系统</title>
<style>
:root {
--bg: #edf2f0;
--ink: #0f172a;
--muted: #64748b;
--surface: #ffffff;
--line: #d8e1e8;
--primary: #006b5e;
--primary-2: #0f766e;
--primary-dark: #061416;
--mint: #e1f6f1;
--gold: #f5a524;
--gold-soft: #fff2cf;
--blue: #2563eb;
--blue-soft: #e7efff;
--paper: #f8fafc;
--shadow: 0 24px 70px rgba(15, 23, 42, 0.14);
}
* { box-sizing: border-box; }
body {
margin: 0;
color: var(--ink);
background:
linear-gradient(90deg, rgba(15, 23, 42, 0.045) 1px, transparent 1px),
linear-gradient(rgba(15, 23, 42, 0.045) 1px, transparent 1px),
var(--bg);
background-size: 28px 28px;
font-family: "IBM Plex Sans", "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", sans-serif;
letter-spacing: 0;
}
.wrap {
max-width: 1500px;
margin: 0 auto;
padding: 34px 30px 70px;
}
.hero {
display: grid;
grid-template-columns: minmax(0, 1fr) 360px;
gap: 22px;
margin-bottom: 24px;
}
.panel {
border: 1px solid rgba(15, 23, 42, 0.08);
border-radius: 8px;
background: rgba(255,255,255,0.86);
box-shadow: 0 18px 48px rgba(15, 23, 42, 0.08);
}
.hero-main {
min-height: 260px;
padding: 30px;
display: grid;
align-content: center;
}
.kicker {
width: fit-content;
min-height: 28px;
padding: 5px 10px;
border-radius: 999px;
border: 1px solid rgba(0, 107, 94, 0.18);
color: var(--primary);
background: var(--mint);
font-size: 12px;
font-weight: 900;
}
h1 {
max-width: 760px;
margin: 14px 0 10px;
font-size: 36px;
line-height: 1.12;
letter-spacing: 0;
}
.hero p,
.section p {
max-width: 860px;
margin: 0;
color: var(--muted);
font-size: 14px;
line-height: 1.62;
font-weight: 650;
}
.hero-side {
padding: 18px;
display: grid;
gap: 10px;
align-content: center;
}
.checkline {
display: grid;
grid-template-columns: 34px minmax(0, 1fr);
gap: 10px;
align-items: center;
min-height: 58px;
padding: 10px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
}
.checkline strong {
display: block;
font-size: 13px;
margin-bottom: 2px;
}
.checkline span {
display: block;
color: var(--muted);
font-size: 12px;
line-height: 1.35;
font-weight: 650;
}
.icon {
width: 34px;
height: 34px;
border-radius: 8px;
display: grid;
place-items: center;
color: var(--primary);
background: var(--mint);
}
.icon.gold { color: #8a5a00; background: var(--gold-soft); }
.icon.blue { color: var(--blue); background: var(--blue-soft); }
.grid {
display: grid;
grid-template-columns: 420px minmax(0, 1fr);
gap: 24px;
align-items: start;
}
.section {
padding: 20px;
margin-bottom: 24px;
}
.section h2 {
margin: 0 0 6px;
font-size: 20px;
letter-spacing: 0;
}
.phone {
width: 316px;
height: 684px;
margin: 0 auto;
padding: 9px;
border-radius: 34px;
background: #101827;
box-shadow: var(--shadow);
}
.screen {
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
border-radius: 27px;
color: #fff;
background: var(--primary-dark);
}
.status {
display: flex;
justify-content: space-between;
align-items: center;
height: 30px;
padding: 0 16px;
font-size: 11px;
font-weight: 900;
}
.sys { display: flex; gap: 5px; align-items: center; }
.sig, .wifi, .bat { display: inline-block; border: 1.7px solid currentColor; }
.sig { width: 12px; height: 10px; border-top: 0; border-left: 0; transform: skew(-8deg); }
.wifi { width: 13px; height: 8px; border-bottom: 0; border-left-color: transparent; border-right-color: transparent; border-radius: 14px 14px 0 0; }
.bat { width: 18px; height: 10px; border-radius: 2px; background: linear-gradient(90deg, currentColor 68%, transparent 68%); }
.splash {
position: relative;
height: calc(100% - 30px);
padding: 48px 16px 22px;
display: flex;
flex-direction: column;
isolation: isolate;
}
.splash::before {
content: "";
position: absolute;
inset: -34px -18px auto;
height: 320px;
z-index: -1;
background:
radial-gradient(circle at 28% 18%, rgba(245, 165, 36, 0.18), transparent 26%),
linear-gradient(135deg, rgba(255,255,255,0.12), transparent 34%),
linear-gradient(90deg, rgba(255,255,255,0.07) 1px, transparent 1px),
linear-gradient(rgba(255,255,255,0.07) 1px, transparent 1px);
background-size: auto, auto, 24px 24px, 24px 24px;
}
.topline {
display: flex;
justify-content: space-between;
color: rgba(255,255,255,0.68);
font-size: 10px;
font-weight: 900;
letter-spacing: 0.08em;
}
.lockup {
display: grid;
justify-items: center;
gap: 15px;
margin-top: 42px;
text-align: center;
}
.brand-mark {
position: relative;
display: grid;
place-items: center;
width: 74px;
height: 74px;
border-radius: 22px;
background: linear-gradient(145deg, #0b3b36, #00806f);
box-shadow: 0 24px 58px rgba(0,0,0,0.36), 0 0 0 1px rgba(255,255,255,0.16) inset;
}
.brand-mark::before,
.brand-mark::after {
content: "";
position: absolute;
width: 20px;
height: 42px;
border-radius: 999px;
background: rgba(255,255,255,0.92);
transform: rotate(28deg);
}
.brand-mark::before { left: 20px; top: 15px; }
.brand-mark::after { right: 20px; bottom: 15px; opacity: 0.72; }
.splash-name {
font-size: 25px;
line-height: 1.05;
font-weight: 950;
}
.splash-tag {
max-width: 230px;
margin-top: 8px;
color: rgba(255,255,255,0.68);
font-size: 12px;
line-height: 1.48;
font-weight: 750;
}
.scene {
position: relative;
height: 252px;
margin-top: 34px;
border-radius: 8px;
border: 1px solid rgba(255,255,255,0.13);
overflow: hidden;
background:
linear-gradient(90deg, rgba(255,255,255,0.07) 1px, transparent 1px),
linear-gradient(rgba(255,255,255,0.07) 1px, transparent 1px),
linear-gradient(145deg, #062425, #0a5f56 58%, #103a36);
background-size: 22px 22px, 22px 22px, auto;
box-shadow: 0 22px 50px rgba(0,0,0,0.34);
}
.device {
position: absolute;
left: 18px;
top: 28px;
width: 128px;
height: 188px;
border-radius: 8px;
border: 1px solid rgba(255,255,255,0.2);
background: rgba(3, 21, 24, 0.72);
box-shadow: 0 18px 36px rgba(0,0,0,0.28);
}
.device span {
display: block;
height: 8px;
margin: 8px 14px;
border-radius: 999px;
background: rgba(255,255,255,0.2);
}
.device span:first-child {
width: 72%;
margin-top: 26px;
background: rgba(255,255,255,0.78);
}
.amount {
position: absolute;
left: 14px;
right: 14px;
bottom: 18px;
padding: 11px;
border-radius: 8px;
background: rgba(255,255,255,0.08);
font-size: 19px;
font-weight: 950;
}
.amount small {
display: block;
margin-bottom: 3px;
color: rgba(255,255,255,0.52);
font-size: 9px;
font-weight: 900;
letter-spacing: 0.05em;
}
.asset-card {
position: absolute;
right: 15px;
top: 42px;
width: 156px;
padding: 13px;
border-radius: 8px;
background: rgba(255,255,255,0.94);
color: var(--ink);
box-shadow: 0 18px 42px rgba(0,0,0,0.28);
}
.asset-card.secondary {
top: 132px;
right: 34px;
width: 174px;
}
.chip {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 3px 9px;
border-radius: 999px;
color: #8a5a00;
background: var(--gold-soft);
font-size: 11px;
font-weight: 950;
}
.asset-card h3 {
margin: 8px 0 4px;
font-size: 15px;
line-height: 1.18;
}
.asset-card p {
margin: 0;
color: var(--muted);
font-size: 11px;
line-height: 1.4;
font-weight: 750;
}
.float-pill {
position: absolute;
left: 18px;
bottom: 18px;
min-height: 32px;
padding: 7px 10px;
border-radius: 999px;
color: #d7fff7;
background: rgba(0, 91, 79, 0.75);
border: 1px solid rgba(255,255,255,0.12);
font-size: 11px;
font-weight: 950;
}
.splash-footer {
margin-top: auto;
display: grid;
gap: 11px;
text-align: center;
}
.progress {
width: 118px;
height: 4px;
margin: 0 auto;
border-radius: 999px;
background: rgba(255,255,255,0.14);
overflow: hidden;
}
.progress::after {
content: "";
display: block;
width: 66%;
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, #dffcf4, var(--gold));
}
.small-copy {
color: rgba(255,255,255,0.68);
font-size: 12px;
font-weight: 750;
}
.asset-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin-top: 16px;
}
.asset {
min-height: 138px;
padding: 14px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
display: grid;
align-content: space-between;
gap: 12px;
}
.asset.dark {
color: #fff;
background: var(--primary-dark);
border-color: rgba(255,255,255,0.16);
}
.asset-title {
font-size: 13px;
font-weight: 950;
}
.asset-meta {
color: var(--muted);
font-size: 11px;
line-height: 1.4;
font-weight: 700;
}
.asset.dark .asset-meta { color: rgba(255,255,255,0.62); }
.app-icons {
display: flex;
gap: 14px;
align-items: end;
margin-top: 16px;
}
.app-icon {
position: relative;
border-radius: 22%;
background:
linear-gradient(145deg, #0b3b36, #00806f);
box-shadow: 0 16px 38px rgba(0, 91, 79, 0.26);
}
.app-icon::before,
.app-icon::after {
content: "";
position: absolute;
border-radius: 999px;
background: rgba(255,255,255,0.92);
transform: rotate(28deg);
}
.app-icon::before { left: 27%; top: 20%; width: 22%; height: 56%; }
.app-icon::after { right: 27%; bottom: 20%; width: 22%; height: 56%; opacity: 0.72; }
.app-icon.lg { width: 96px; height: 96px; }
.app-icon.md { width: 72px; height: 72px; }
.app-icon.sm { width: 48px; height: 48px; }
.spec-list {
display: grid;
gap: 10px;
margin-top: 16px;
}
.spec {
display: grid;
grid-template-columns: 180px minmax(0, 1fr);
gap: 12px;
padding: 12px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
font-size: 13px;
}
.spec strong {
min-width: 0;
font-weight: 950;
overflow-wrap: anywhere;
}
.spec span {
min-width: 0;
color: var(--muted);
line-height: 1.45;
font-weight: 650;
overflow-wrap: anywhere;
}
.motion {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin-top: 16px;
}
.frame {
padding: 14px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
}
.frame strong {
display: block;
margin-bottom: 6px;
font-size: 13px;
}
.frame span {
color: var(--muted);
font-size: 12px;
line-height: 1.45;
font-weight: 650;
}
.mini-scene {
height: 72px;
margin-bottom: 10px;
border-radius: 8px;
background:
linear-gradient(90deg, rgba(255,255,255,0.08) 1px, transparent 1px),
linear-gradient(rgba(255,255,255,0.08) 1px, transparent 1px),
linear-gradient(145deg, #062425, #0a5f56);
background-size: 18px 18px, 18px 18px, auto;
}
.color-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 8px;
margin-top: 16px;
}
.swatch {
min-height: 76px;
padding: 10px;
border-radius: 8px;
border: 1px solid rgba(15,23,42,0.1);
display: grid;
align-content: end;
color: #fff;
font-size: 11px;
font-weight: 900;
}
.swatch.light { color: var(--ink); }
@media (max-width: 1180px) {
.hero,
.grid { grid-template-columns: 1fr; }
.phone { margin-left: 0; }
}
@media (max-width: 760px) {
.wrap { padding: 22px 12px 40px; }
h1 { font-size: 28px; }
.asset-grid,
.motion,
.color-row { grid-template-columns: 1fr; }
.spec { grid-template-columns: 1fr; }
.phone { width: min(316px, 100%); }
}
</style>
</head>
<body>
<main class="wrap">
<section class="hero">
<div class="panel hero-main">
<span class="kicker">Splash asset system</span>
<h1>X-Financial Expense 启动页素材系统</h1>
<p>这页专门给 Android 开机页使用,不直接复用业务页面卡片。素材分成品牌锁定、深色背景、票据场景、启动动效和 Android 落地规格,后续开发 Compose 或原生启动页时按这里取值。</p>
</div>
<aside class="panel hero-side">
<div class="checkline"><div class="icon">01</div><div><strong>启动页先看品牌</strong><span>Logo、产品名和安全工作台定位占主导不放登录表单。</span></div></div>
<div class="checkline"><div class="icon gold">02</div><div><strong>业务只做隐喻</strong><span>票据、审批、金额作为启动素材出现,不承载真实操作。</span></div></div>
<div class="checkline"><div class="icon blue">03</div><div><strong>可直接落 Android</strong><span>提供颜色、图标尺寸、动效节奏和 SplashScreen API 参数。</span></div></div>
</aside>
</section>
<section class="grid">
<div class="panel section">
<h2>启动页预览</h2>
<p>用于 9:16 Android 手机首屏,登录态检查完成后跳转登录页或首页。</p>
<div style="height:16px"></div>
<div class="phone">
<div class="screen">
<div class="status"><span>9:41</span><span class="sys"><i class="sig"></i><i class="wifi"></i><i class="bat"></i></span></div>
<div class="splash">
<div class="topline"><span>SECURE EXPENSE</span><span>ANDROID</span></div>
<div class="lockup">
<div class="brand-mark"></div>
<div>
<div class="splash-name">X-Financial<br/>Expense</div>
<div class="splash-tag">出差申请、票据采集、报销提交、移动审批</div>
</div>
</div>
<div class="scene">
<div class="device">
<span></span><span></span><span></span>
<div class="amount"><small>本月待处理</small>¥ 3,280</div>
</div>
<div class="asset-card">
<span class="chip">AI 识别</span>
<h3>票据已归类</h3>
<p>5 张票据 · 2 项待补</p>
</div>
<div class="asset-card secondary">
<h3>审批流已同步</h3>
<p>财务复核中 · 待提醒</p>
</div>
<div class="float-pill">拍照上传</div>
</div>
<div class="splash-footer">
<div class="progress"></div>
<div class="small-copy">正在加载安全工作台</div>
</div>
</div>
</div>
</div>
</div>
<div>
<section class="panel section">
<h2>品牌与 App 图标</h2>
<p>App 图标保留双斜票据形态,避免直接使用文字。启动页 Logo 使用 74dp 等比缩放,图标安全区不低于 12dp。</p>
<div class="app-icons">
<div class="app-icon lg"></div>
<div class="app-icon md"></div>
<div class="app-icon sm"></div>
</div>
<div class="asset-grid">
<div class="asset"><div class="brand-mark" style="width:58px;height:58px;border-radius:17px"></div><div><div class="asset-title">启动 Logo</div><div class="asset-meta">74dp / 58dp / 44dp 三档,深色背景使用。</div></div></div>
<div class="asset dark"><div class="app-icon md"></div><div><div class="asset-title">Launcher Icon</div><div class="asset-meta">前景图形居中,保留 Android 自适应图标裁切空间。</div></div></div>
<div class="asset"><div class="chip">AI 识别</div><div><div class="asset-title">业务状态 Chip</div><div class="asset-meta">仅作为视觉线索,不做主操作入口。</div></div></div>
</div>
</section>
<section class="panel section">
<h2>颜色与背景</h2>
<p>启动页走深色金融安全感。绿色做品牌,金色只用于识别和进度强调,蓝色用于信息状态。</p>
<div class="color-row">
<div class="swatch" style="background:#061416">#061416<br/>启动底色</div>
<div class="swatch" style="background:#006b5e">#006B5E<br/>品牌主色</div>
<div class="swatch" style="background:#0f766e">#0F766E<br/>场景渐变</div>
<div class="swatch" style="background:#f5a524;color:#251500">#F5A524<br/>识别强调</div>
<div class="swatch light" style="background:#f8fafc">#F8FAFC<br/>票据纸面</div>
</div>
</section>
<section class="panel section">
<h2>素材拆分</h2>
<p>开发落地时建议拆成 5 个可复用素材层Compose 中可分别写成 Composable。</p>
<div class="asset-grid">
<div class="asset dark"><div class="mini-scene"></div><div><div class="asset-title">背景层</div><div class="asset-meta">深色底、细网格、顶部柔光,静态即可。</div></div></div>
<div class="asset"><div class="asset-card" style="position:static;width:auto;box-shadow:none;border:1px solid var(--line)"><span class="chip">AI 识别</span><h3>票据已归类</h3><p>5 张票据 · 2 项待补</p></div><div><div class="asset-title">票据层</div><div class="asset-meta">表达拍照上传和 OCR不显示真实敏感票据信息。</div></div></div>
<div class="asset"><div class="float-pill" style="position:static;color:#006b5e;background:var(--mint);border:0;width:max-content">拍照上传</div><div><div class="asset-title">状态层</div><div class="asset-meta">启动时轻提示900ms 后淡出。</div></div></div>
</div>
</section>
<section class="panel section">
<h2>启动动效节奏</h2>
<p>控制在 900ms 左右,不阻塞用户进入登录或首页。系统检测慢时只延长进度条,不重复播放动画。</p>
<div class="motion">
<div class="frame"><div class="mini-scene"></div><strong>0ms</strong><span>深色底和网格先出现,避免白屏。</span></div>
<div class="frame"><div class="mini-scene"></div><strong>160ms</strong><span>Logo scale 0.92 到 1透明度进入。</span></div>
<div class="frame"><div class="mini-scene"></div><strong>320ms</strong><span>产品名和定位文案淡入。</span></div>
<div class="frame"><div class="mini-scene"></div><strong>520ms</strong><span>票据场景上移 8dp进度条启动。</span></div>
</div>
</section>
<section class="panel section">
<h2>Android 落地规格</h2>
<p>先走 Android 原生启动,再进入 Compose 首页。冷启动用系统 SplashScreen业务素材用于第一个 Activity 的过渡页。</p>
<div class="spec-list">
<div class="spec"><strong>windowSplashScreenBackground</strong><span>#061416。系统启动页避免白屏和业务过渡页底色一致。</span></div>
<div class="spec"><strong>windowSplashScreenAnimatedIcon</strong><span>只放 App 图标前景,不放产品文字,防止小屏裁切。</span></div>
<div class="spec"><strong>过渡页时长</strong><span>登录态检查完成即跳转;正常 600-900ms异常最长 1800ms 后进入登录页。</span></div>
<div class="spec"><strong>Compose 拆分</strong><span>SplashBackground、BrandLockup、ExpenseScene、LoadingRail 四个组件。</span></div>
<div class="spec"><strong>无障碍</strong><span>启动页只设置应用名称 contentDescription业务装饰图不参与朗读。</span></div>
</div>
</section>
</div>
</section>
</main>
</body>
</html>