Files
zt-closet-wxmini-frontend/miniprogram/app.wxss
T
zhengchiliu 45222317af feat: 支持游客免登录浏览核心页面
未登录用户可先浏览衣橱、穿搭、运势、分享等内容,登录改为用户主动选择,并在登录页增加协议勾选确认与暂不登录入口。
2026-09-16 21:44:04 +08:00

914 lines
27 KiB
Plaintext

/** app.wxss —— v2 设计令牌与通用样式:零彩色灰阶 / 毛玻璃浮层 / 杂志大留白 **/
@import "styles/icons.wxss";
/* ============================================================================
§1 设计令牌(唯一颜色与度量来源,页面禁止硬编码彩色)
========================================================================== */
page {
/* 墨阶 */
--ink: #0A0A0A;
--ink-2: #6E6E73;
--ink-3: #AEAEB2;
--ink-4: #C9C9CE;
--art: #B9B9BE; /* 衣物线稿色 */
/* 纸面 */
--paper: #FFFFFF;
--paper-2: #F7F7F5;
--paper-3: #EFEFED;
/* 发丝线与填充 */
--hairline: rgba(0, 0, 0, .08);
--hairline-2: rgba(0, 0, 0, .14);
--fill: rgba(120, 120, 128, .07);
--fill-2: rgba(120, 120, 128, .13);
/* 深色块(全稿唯一视觉锚点:商城会员卡) */
--block: #1C1C1E;
--block-2: #2C2C2E;
/* 玻璃 */
--glass: rgba(255, 255, 255, .72);
--glass-2: rgba(255, 255, 255, .86);
--glass-dark: rgba(28, 28, 30, .82);
/* 字族 */
--serif: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", Georgia, "Times New Roman", serif;
--sans: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif;
/* 缓动 */
--ease: cubic-bezier(.32, .72, 0, 1);
--ease-out: cubic-bezier(.22, 1, .36, 1);
/* 圆角:仅小控件与抽屉使用圆角,大块内容保持直角 */
--r-img: 8rpx;
--r-ctrl: 20rpx;
--r-sheet: 40rpx;
--r-pill: 999rpx;
/* 度量 */
--pad: 40rpx;
--nav-h: 88rpx;
--tab-h: 120rpx;
--safe-b: 28rpx;
background: var(--paper);
color: var(--ink);
font-family: var(--sans);
font-size: 30rpx;
line-height: 1.62;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
view,
text,
image,
input,
textarea,
scroll-view,
swiper,
swiper-item {
box-sizing: border-box;
}
/* ============================================================================
§2 排版 · 双字阶(衬线大标题 / 无衬线正文)
========================================================================== */
.eyebrow {
font-size: 20rpx;
font-weight: 600;
letter-spacing: .16em;
text-transform: uppercase;
color: var(--ink-3);
line-height: 1;
}
.display {
font-family: var(--serif);
font-size: 68rpx;
font-weight: 500;
letter-spacing: -.012em;
line-height: 1.14;
}
.t-xl { font-family: var(--serif); font-size: 52rpx; font-weight: 500; letter-spacing: -.01em; line-height: 1.22; }
.t-lg { font-family: var(--serif); font-size: 40rpx; font-weight: 500; letter-spacing: -.005em; line-height: 1.32; }
.t-md { font-size: 34rpx; font-weight: 600; line-height: 1.38; }
.t-bd { font-size: 30rpx; line-height: 1.62; }
.t-sm { font-size: 26rpx; line-height: 1.55; color: var(--ink-2); }
.t-xs { font-size: 22rpx; line-height: 1.5; color: var(--ink-3); }
.t-quote { font-family: var(--serif); font-size: 32rpx; line-height: 1.85; letter-spacing: .005em; color: var(--ink); }
.num { font-variant-numeric: tabular-nums; }
.c-ink { color: var(--ink); }
.c-2 { color: var(--ink-2); }
.c-3 { color: var(--ink-3); }
.c-4 { color: var(--ink-4); }
.ell { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ============================================================================
§3 布局 · 页面容器 / 页头 / 间距 / 发丝线
========================================================================== */
.page {
min-height: 100vh;
background: var(--paper);
}
/* 底部预留:悬浮标签栏 / 悬浮双按钮条 / 悬浮操作条遮挡避让 */
.pb-tab { padding-bottom: calc(var(--tab-h) + 60rpx + env(safe-area-inset-bottom)); }
.pb-float { padding-bottom: calc(var(--tab-h) + 220rpx + env(safe-area-inset-bottom)); }
.pb-dock { padding-bottom: calc(190rpx + env(safe-area-inset-bottom)); }
.pb-safe { padding-bottom: calc(40rpx + env(safe-area-inset-bottom)); }
.head { padding: 24rpx var(--pad) 0; }
.head .eyebrow { margin-bottom: 20rpx; }
.head-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 28rpx; }
.head-meta {
font-size: 22rpx;
color: var(--ink-3);
letter-spacing: .02em;
padding-bottom: 12rpx;
text-align: right;
line-height: 1.6;
font-variant-numeric: tabular-nums;
}
.pad { padding-left: var(--pad); padding-right: var(--pad); }
.spacer { flex: 1; }
.center { display: flex; align-items: center; justify-content: center; }
.stack { display: flex; flex-direction: column; }
.sec { margin-top: 64rpx; }
.hair { border-bottom: 1rpx solid var(--hairline); }
.hair-t { border-top: 1rpx solid var(--hairline); }
.gap-8 { height: 8rpx; }
.gap-16 { height: 16rpx; }
.gap-24 { height: 24rpx; }
.gap-32 { height: 32rpx; }
.gap-48 { height: 48rpx; }
.gap-64 { height: 64rpx; }
.safe-bottom { padding-bottom: env(safe-area-inset-bottom); }
/* ============================================================================
§4 按钮 · 实心黑 / 描边 / 浅填充 / 玻璃 / 下划线文字
========================================================================== */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 14rpx;
height: 100rpx;
padding: 0 44rpx;
border-radius: var(--r-pill);
font-size: 30rpx;
font-weight: 500;
letter-spacing: .01em;
white-space: nowrap;
transition: transform .18s var(--ease), opacity .18s var(--ease), background .2s var(--ease);
}
.btn:active { transform: scale(.972); opacity: .74; }
.btn--block { display: flex; width: 100%; }
.btn--sm { height: 72rpx; padding: 0 30rpx; font-size: 27rpx; }
.btn--ink { background: var(--ink); color: #fff; }
.btn--ink.is-off { background: var(--fill-2); color: var(--ink-3); pointer-events: none; }
.btn--ghost { box-shadow: inset 0 0 0 1rpx var(--hairline-2); color: var(--ink); }
.btn--plain { background: var(--fill); color: var(--ink); }
.btn--glass {
background: var(--glass-2);
-webkit-backdrop-filter: saturate(180%) blur(22px);
backdrop-filter: saturate(180%) blur(22px);
border: 1rpx solid rgba(255, 255, 255, .7);
box-shadow: 0 16rpx 48rpx -20rpx rgba(0, 0, 0, .18);
color: var(--ink);
}
.btn--text {
height: auto;
padding: 0;
border-radius: 0;
font-size: 28rpx;
font-weight: 400;
color: var(--ink);
text-decoration: underline;
text-underline-offset: 7rpx;
text-decoration-thickness: 1rpx;
text-decoration-color: var(--ink-4);
}
.btn--text:active { opacity: .5; transform: none; }
.btn .icon { width: 34rpx; height: 34rpx; }
/* ============================================================================
§5 胶囊标签 · 零彩色状态语义
进行中/强调 = pill--ink;中性 = pill;失效/只读 = pill--line + 降透明
========================================================================== */
.pill {
display: inline-flex;
align-items: center;
gap: 8rpx;
height: 46rpx;
padding: 0 18rpx;
border-radius: var(--r-pill);
font-size: 22rpx;
font-weight: 500;
letter-spacing: .015em;
background: var(--fill);
color: var(--ink-2);
white-space: nowrap;
}
.pill--ink { background: var(--ink); color: #fff; }
.pill--line { background: transparent; box-shadow: inset 0 0 0 1rpx var(--hairline-2); color: var(--ink-2); }
.pill--plain { background: transparent; color: var(--ink-3); padding: 0 4rpx; }
.pill--dim { opacity: .45; }
.pill--dot::before {
content: '';
width: 10rpx;
height: 10rpx;
border-radius: 50%;
background: currentColor;
opacity: .55;
}
.pill .icon { width: 24rpx; height: 24rpx; }
/* ============================================================================
§6 列表 · 分组标题 / 行 / 规格表 / 数字条
========================================================================== */
.rows { background: var(--paper); }
.row {
display: flex;
align-items: center;
gap: 24rpx;
min-height: 104rpx;
width: 100%;
padding: 0 var(--pad);
border-bottom: 1rpx solid var(--hairline);
transition: background .16s var(--ease);
}
.row:active { background: var(--fill); }
.row-lb { flex: 1; font-size: 30rpx; line-height: 1.4; }
.row-vl { font-size: 27rpx; color: var(--ink-3); font-variant-numeric: tabular-nums; }
.row-ch { width: 26rpx; height: 26rpx; color: var(--ink-4); flex-shrink: 0; }
.row-ic { width: 38rpx; height: 38rpx; color: var(--ink-2); flex-shrink: 0; }
.row-badge {
min-width: 34rpx;
height: 34rpx;
padding: 0 10rpx;
border-radius: 18rpx;
background: var(--ink);
color: #fff;
font-size: 20rpx;
font-weight: 600;
line-height: 34rpx;
text-align: center;
font-variant-numeric: tabular-nums;
}
.grp-hd { display: flex; align-items: baseline; gap: 18rpx; padding: 0 var(--pad) 22rpx; }
.grp-hd .gh-cn { font-size: 26rpx; font-weight: 600; letter-spacing: .01em; color: var(--ink); }
.grp-hd .gh-en { font-size: 19rpx; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--ink-3); }
.grp-line { height: 1rpx; background: var(--hairline); margin: 0 var(--pad) 8rpx; }
.spec {
display: flex;
align-items: flex-start;
gap: 28rpx;
padding: 22rpx var(--pad);
border-bottom: 1rpx solid var(--hairline);
}
.spec-k { width: 160rpx; flex-shrink: 0; font-size: 26rpx; color: var(--ink-2); line-height: 1.5; }
.spec-v { flex: 1; font-size: 29rpx; line-height: 1.5; text-align: right; color: var(--ink); }
.spec-v .dot {
display: inline-block;
width: 18rpx;
height: 18rpx;
border-radius: 50%;
margin-right: 12rpx;
vertical-align: -1rpx;
box-shadow: inset 0 0 0 1rpx rgba(0, 0, 0, .14);
}
.stats { display: flex; border-top: 1rpx solid var(--hairline); border-bottom: 1rpx solid var(--hairline); }
.stat { flex: 1; padding: 28rpx 0 30rpx; text-align: center; position: relative; }
.stat + .stat::before {
content: '';
position: absolute;
left: 0;
top: 28rpx;
bottom: 30rpx;
width: 1rpx;
background: var(--hairline);
}
.stat-n {
font-family: var(--serif);
font-size: 48rpx;
font-weight: 500;
line-height: 1;
letter-spacing: -.01em;
font-variant-numeric: tabular-nums;
}
.stat-n .unit { font-size: 24rpx; color: var(--ink-3); margin-left: 4rpx; }
.stat-l {
margin-top: 12rpx;
font-size: 19rpx;
font-weight: 600;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--ink-3);
}
/* ============================================================================
§7 进度轨 / 评分点阵 / 刻度尺
========================================================================== */
.track { height: 3rpx; background: var(--hairline-2); position: relative; overflow: hidden; }
.track .bar { position: absolute; left: 0; top: 0; bottom: 0; background: var(--ink); }
.track.is-warn .bar { background: var(--ink-2); }
.dots { display: inline-flex; gap: 10rpx; vertical-align: middle; }
.dots .d { width: 16rpx; height: 16rpx; border-radius: 50%; box-shadow: inset 0 0 0 2rpx var(--ink-4); }
.dots .d.on { background: var(--ink); box-shadow: none; }
.scale { position: relative; height: 52rpx; }
.scale-line { position: absolute; left: 0; right: 0; top: 24rpx; height: 2rpx; background: var(--hairline-2); }
.scale-fill { position: absolute; left: 0; top: 24rpx; height: 2rpx; background: var(--ink); }
.scale-pip {
position: absolute;
top: 17rpx;
width: 16rpx;
height: 16rpx;
border-radius: 50%;
background: var(--ink);
transform: translateX(-50%);
}
.scale-ticks {
position: absolute;
left: 0;
right: 0;
top: 20rpx;
height: 10rpx;
display: flex;
justify-content: space-between;
}
.scale-ticks .tk { width: 1rpx; height: 10rpx; background: var(--hairline-2); }
/* ============================================================================
§8 图片瓦片 · 拼图封面 · 勾选
========================================================================== */
.tile-img {
position: relative;
width: 100%;
aspect-ratio: 1 / 1;
background: var(--paper-2);
border-radius: var(--r-img);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.tile-img .ph { width: 56%; height: 56%; color: var(--art); }
.tile-img.is-empty .ph { width: 34%; height: 34%; color: var(--ink-4); }
.tile-img .pic { width: 100%; height: 100%; }
.tile-name {
margin-top: 18rpx;
font-family: var(--serif);
font-size: 28rpx;
line-height: 1.35;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tile-sub {
margin-top: 4rpx;
font-size: 21rpx;
color: var(--ink-3);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tile-flag {
position: absolute;
top: 14rpx;
left: 14rpx;
height: 38rpx;
padding: 0 14rpx;
border-radius: 20rpx;
background: var(--glass-2);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
font-size: 19rpx;
font-weight: 500;
line-height: 38rpx;
color: var(--ink-2);
}
.tile-flag.is-ink { background: var(--ink); color: #fff; }
.tile-check {
position: absolute;
right: 14rpx;
bottom: 14rpx;
width: 40rpx;
height: 40rpx;
border-radius: 50%;
box-shadow: inset 0 0 0 2rpx rgba(255, 255, 255, .9), 0 0 0 1rpx rgba(0, 0, 0, .12);
background: rgba(255, 255, 255, .55);
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
display: flex;
align-items: center;
justify-content: center;
color: #fff;
transition: background .18s var(--ease), color .18s var(--ease);
}
.tile-check .icon { width: 24rpx; height: 24rpx; opacity: 0; }
.is-picked .tile-check { background: var(--ink); }
.is-picked .tile-check .icon { opacity: 1; }
.is-picked .tile-img { box-shadow: inset 0 0 0 3rpx var(--ink); }
.collage {
position: relative;
display: grid;
gap: 2rpx;
background: var(--paper);
border-radius: var(--r-img);
overflow: hidden;
aspect-ratio: 1 / 1;
grid-template-columns: 1fr 1fr;
}
.collage--1 { grid-template-columns: 1fr; aspect-ratio: 1 / 1; }
.collage--2 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr; aspect-ratio: 2 / 1; }
.collage--3 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; }
.collage--3 .cg:first-child { grid-row: span 2; }
.collage .cg {
position: relative;
background: var(--paper-2);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
min-width: 0;
min-height: 0;
}
.collage .cg .ph { width: 44%; height: 44%; color: var(--art); }
.collage .cg .pic { width: 100%; height: 100%; }
.cg-more {
position: absolute;
inset: 0;
background: rgba(255, 255, 255, .7);
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
display: flex;
align-items: center;
justify-content: center;
font-family: var(--serif);
font-size: 34rpx;
color: var(--ink);
}
.cg-badge {
position: absolute;
right: 16rpx;
bottom: 16rpx;
height: 42rpx;
padding: 0 16rpx;
border-radius: 22rpx;
background: var(--glass-2);
-webkit-backdrop-filter: blur(12px);
backdrop-filter: blur(12px);
font-size: 21rpx;
line-height: 42rpx;
color: var(--ink);
font-variant-numeric: tabular-nums;
}
/* ============================================================================
§9 骨架屏 · 空态 · 页脚提示
========================================================================== */
.sk {
background: linear-gradient(90deg, #F2F2F0 25%, #E9E9E6 37%, #F2F2F0 63%);
background-size: 400% 100%;
animation: skLoad 1.5s ease infinite;
}
@keyframes skLoad {
0% { background-position: 100% 50%; }
100% { background-position: 0 50%; }
}
.sk-img { width: 100%; aspect-ratio: 1 / 1; border-radius: var(--r-img); }
.sk-ln { height: 20rpx; border-radius: 10rpx; }
.empty {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: 128rpx 88rpx 0;
}
.empty-ic { width: 104rpx; height: 104rpx; color: var(--ink-4); margin-bottom: 40rpx; }
.empty-t { font-family: var(--serif); font-size: 38rpx; font-weight: 500; letter-spacing: -.005em; }
.empty-d { margin-top: 16rpx; font-size: 26rpx; line-height: 1.7; color: var(--ink-2); max-width: 480rpx; }
.empty-b { margin-top: 48rpx; }
.foot-note { padding: 52rpx 0 16rpx; text-align: center; font-size: 22rpx; color: var(--ink-4); letter-spacing: .06em; }
/* ============================================================================
§10 分段条 / 分类条 · 下划线式极简
========================================================================== */
.seg { display: flex; gap: 36rpx; padding: 0 var(--pad); white-space: nowrap; }
.seg-item {
position: relative;
flex-shrink: 0;
padding: 22rpx 0 24rpx;
font-size: 29rpx;
color: var(--ink-3);
letter-spacing: .005em;
transition: color .2s var(--ease);
}
.seg-item.is-on { color: var(--ink); font-weight: 500; }
.seg-item.is-on::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 3rpx;
background: var(--ink);
border-radius: 2rpx;
}
.seg-scroll { white-space: nowrap; }
/* ============================================================================
§11 悬浮层 · 底部操作条 / 双按钮条 / FAB
========================================================================== */
.dock {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 45;
padding: 24rpx var(--pad) calc(28rpx + env(safe-area-inset-bottom));
background: var(--glass);
-webkit-backdrop-filter: saturate(180%) blur(22px);
backdrop-filter: saturate(180%) blur(22px);
border-top: 1rpx solid var(--hairline);
}
.dock-row { display: flex; align-items: center; gap: 24rpx; }
.dock-ic {
display: flex;
align-items: center;
gap: 10rpx;
font-size: 25rpx;
color: var(--ink-2);
font-variant-numeric: tabular-nums;
transition: color .18s var(--ease), transform .18s var(--ease);
}
.dock-ic .icon { width: 42rpx; height: 42rpx; }
.dock-ic.is-on { color: var(--ink); }
.dock-ic:active { transform: scale(.92); }
.float-duo {
position: fixed;
left: 32rpx;
right: 32rpx;
bottom: calc(var(--tab-h) + 48rpx + env(safe-area-inset-bottom));
z-index: 45;
display: flex;
gap: 18rpx;
}
.float-duo .btn { flex: 1; height: 92rpx; font-size: 28rpx; }
.fab {
position: fixed;
right: 40rpx;
bottom: calc(var(--tab-h) + 56rpx + env(safe-area-inset-bottom));
width: 108rpx;
height: 108rpx;
border-radius: 50%;
background: var(--ink);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 20rpx 44rpx -16rpx rgba(0, 0, 0, .45);
z-index: 46;
transition: transform .18s var(--ease), opacity .18s var(--ease);
}
.fab .icon { width: 44rpx; height: 44rpx; }
.fab:active { transform: scale(.94); opacity: .8; }
/* ============================================================================
§12 表单 · 输入框 / 文本域 / 选择行
========================================================================== */
.input {
height: 96rpx;
background: var(--fill);
border-radius: var(--r-ctrl);
padding: 0 28rpx;
font-size: 29rpx;
width: 100%;
}
.textarea {
background: var(--fill);
border-radius: var(--r-ctrl);
padding: 22rpx 28rpx;
font-size: 29rpx;
width: 100%;
min-height: 200rpx;
}
.input-ph { color: var(--ink-3); }
/* ============================================================================
§13 通用动效
========================================================================== */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(16rpx); }
to { opacity: 1; transform: none; }
}
.fade-up { animation: fadeUp .42s var(--ease) both; }
@keyframes pulse {
0%, 100% { opacity: .35; transform: scale(.96); }
50% { opacity: 1; transform: scale(1); }
}
.pulse { animation: pulse 1.6s var(--ease) infinite; }
/* ============================================================================
§14 导航右侧操作(供 navigation-bar 的 right 插槽内容使用)
========================================================================== */
.nav-action {
font-size: 28rpx;
color: var(--ink-2);
letter-spacing: .01em;
white-space: nowrap;
padding: 12rpx 4rpx;
transition: color .16s var(--ease), opacity .16s var(--ease);
}
.nav-action:active { opacity: .5; }
.nav-action--ink { color: var(--ink); font-weight: 500; }
.nav-more {
width: 68rpx;
height: 68rpx;
display: flex;
align-items: center;
justify-content: center;
color: var(--ink);
}
.nav-more .icon { width: 40rpx; height: 40rpx; }
/* ============================================================================
§15 底部抽屉(页面级 Sheet,含抓手 / 标题行 / 滚动体 / 底部操作区)
========================================================================== */
/* 遮罩只压暗、不做全屏模糊:全屏 backdrop-filter 会让整页发虚 */
.scrim {
position: fixed;
inset: 0;
z-index: 70;
background: rgba(0, 0, 0, .28);
animation: fadeIn .28s var(--ease) both;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.sheet-wrap {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 71;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.sheet {
width: 100%;
max-height: 86vh;
display: flex;
flex-direction: column;
border-radius: var(--r-sheet) var(--r-sheet) 0 0;
overflow: hidden;
background: var(--glass-2);
-webkit-backdrop-filter: saturate(180%) blur(30px);
backdrop-filter: saturate(180%) blur(30px);
border-top: 1rpx solid rgba(255, 255, 255, .7);
box-shadow: 0 -36rpx 100rpx -40rpx rgba(0, 0, 0, .28);
animation: sheetIn .46s var(--ease) both;
}
@keyframes sheetIn {
from { transform: translateY(101%); }
to { transform: none; }
}
.sheet-grab {
width: 72rpx;
height: 8rpx;
border-radius: 4rpx;
background: var(--ink-4);
margin: 16rpx auto 0;
flex-shrink: 0;
}
.sheet-hd {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24rpx;
padding: 28rpx var(--pad) 24rpx;
flex-shrink: 0;
}
.sheet-hd .sheet-t { font-size: 32rpx; font-weight: 600; letter-spacing: -.005em; }
.sheet-hd .sheet-x { font-size: 28rpx; color: var(--ink-2); }
.sheet-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding-bottom: calc(32rpx + env(safe-area-inset-bottom));
}
.sheet-foot {
padding: 24rpx var(--pad) calc(32rpx + env(safe-area-inset-bottom));
border-top: 1rpx solid var(--hairline);
flex-shrink: 0;
}
/* ============================================================================
§16 衣物处理过程(上传页处理中态 / 衣物详情处理中态共用)
========================================================================== */
.up-preview {
margin: 52rpx var(--pad) 0;
aspect-ratio: 4 / 5;
background: var(--paper-2);
border-radius: var(--r-img);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.up-preview .ph { width: 44%; height: 44%; color: var(--art); }
.up-preview .pic { width: 100%; height: 100%; }
.up-steps {
padding: 64rpx var(--pad) 0;
display: flex;
flex-direction: column;
}
.up-step {
display: flex;
align-items: center;
gap: 28rpx;
position: relative;
padding-bottom: 48rpx;
}
.up-step:last-child { padding-bottom: 0; }
/* 竖向发丝线连接 */
.up-step::before {
content: '';
position: absolute;
left: 9rpx;
top: 26rpx;
bottom: 0;
width: 1rpx;
background: var(--hairline-2);
}
.up-step:last-child::before { display: none; }
.up-dot {
width: 20rpx;
height: 20rpx;
border-radius: 50%;
flex-shrink: 0;
background: var(--paper);
box-shadow: inset 0 0 0 2rpx var(--ink-4);
position: relative;
z-index: 1;
}
.up-step.is-done .up-dot { background: var(--ink); box-shadow: none; }
.up-step.is-on .up-dot {
box-shadow: inset 0 0 0 2rpx var(--ink);
animation: dotPulse 1.8s var(--ease) infinite;
}
@keyframes dotPulse {
0%, 100% { box-shadow: inset 0 0 0 2rpx var(--ink), 0 0 0 0 rgba(10, 10, 10, .18); }
55% { box-shadow: inset 0 0 0 2rpx var(--ink), 0 0 0 12rpx rgba(10, 10, 10, 0); }
}
.up-lb { font-size: 27rpx; color: var(--ink-3); letter-spacing: .01em; }
.up-step.is-done .up-lb,
.up-step.is-on .up-lb { color: var(--ink); }
/* 失败态「!」 */
.up-bang {
width: 92rpx;
height: 92rpx;
border-radius: 50%;
margin-bottom: 44rpx;
box-shadow: inset 0 0 0 1rpx var(--hairline-2);
display: flex;
align-items: center;
justify-content: center;
font-family: var(--serif);
font-size: 46rpx;
line-height: 1;
}
.up-duo { display: flex; gap: 20rpx; padding: 56rpx var(--pad) 0; }
.up-duo .btn { flex: 1; }
/* ============================================================================
§17 居中玻璃弹窗卡(页面级自定义弹窗,如登录新手礼包)
========================================================================== */
.modal-wrap {
position: fixed;
inset: 0;
z-index: 72;
display: flex;
align-items: center;
justify-content: center;
padding: 0 68rpx;
}
.modal {
width: 100%;
max-width: 576rpx;
border-radius: var(--r-sheet);
overflow: hidden;
background: var(--glass-2);
-webkit-backdrop-filter: saturate(180%) blur(30px);
backdrop-filter: saturate(180%) blur(30px);
border: 1rpx solid rgba(255, 255, 255, .7);
box-shadow: 0 48rpx 120rpx -36rpx rgba(0, 0, 0, .32);
animation: modalIn .42s var(--ease) both;
}
@keyframes modalIn {
from { opacity: 0; transform: scale(.94); }
to { opacity: 1; transform: none; }
}
.modal-body { padding: 44rpx 40rpx 36rpx; text-align: center; }
.modal-title {
font-family: var(--serif);
font-size: 36rpx;
font-weight: 500;
letter-spacing: -.005em;
}
.modal-text {
margin-top: 16rpx;
font-size: 26rpx;
line-height: 1.6;
color: var(--ink-2);
}
.modal-acts { display: flex; border-top: 1rpx solid var(--hairline); }
.modal-act {
flex: 1;
height: 96rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: var(--ink-2);
transition: background .16s var(--ease);
}
.modal-act:active { background: var(--fill); }
.modal-act + .modal-act { border-left: 1rpx solid var(--hairline); }
.modal-act--main { color: var(--ink); font-weight: 600; }
/* ============================================================================
§18 游客浏览态(未登录)
合规要求:打开小程序可先浏览体验功能,登录仅由用户主动选择。
样式只在既有版式内追加一层:细描边提示条 + 示例角标 + 低调登录引导。
========================================================================== */
.guest-bar {
display: flex;
align-items: center;
gap: 14rpx;
margin: 26rpx var(--pad) 0;
padding: 20rpx 24rpx;
border: 1rpx solid var(--hairline-2);
border-radius: var(--r-ctrl);
background: var(--paper-2);
transition: background .18s var(--ease);
}
.guest-bar:active { background: var(--fill); }
.guest-bar .icon {
width: 30rpx;
height: 30rpx;
color: var(--ink-3);
flex-shrink: 0;
}
.guest-bar .gb-t {
flex: 1;
font-size: 24rpx;
line-height: 1.45;
color: var(--ink-2);
letter-spacing: .01em;
}
.guest-bar .gb-a {
font-size: 24rpx;
font-weight: 600;
color: var(--ink);
flex-shrink: 0;
}
/* 示例内容角标:浅填充底 + 灰字,弱于业务状态胶囊 */
.guest-flag {
position: absolute;
top: 14rpx;
left: 14rpx;
height: 38rpx;
padding: 0 14rpx;
border-radius: 20rpx;
background: var(--fill-2);
font-size: 19rpx;
font-weight: 500;
line-height: 38rpx;
color: var(--ink-2);
}
/* 游客态底部一行登录引导 */
.guest-foot {
display: flex;
align-items: center;
justify-content: center;
gap: 8rpx;
padding: 52rpx var(--pad) 0;
font-size: 23rpx;
color: var(--ink-3);
letter-spacing: .02em;
}
.guest-foot .gf-a {
color: var(--ink);
font-weight: 600;
text-decoration: underline;
text-underline-offset: 7rpx;
text-decoration-thickness: 1rpx;
text-decoration-color: var(--ink-4);
}