Compare commits

...

7 Commits

Author SHA1 Message Date
yuming 192867a8d5 版本号显示 v2.1.5 → v2.1.6
部署到群晖 / deploy (push) Successful in 41s
带农历日期显示的版本,重新上传体验版。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:21:11 +08:00
yuming e643512dfa 纪念日新增农历日期显示
部署到群晖 / deploy (push) Successful in 44s
- 人员详情页:日期下方显示完整农历「农历 YYYY年 X月X日」
- 日历页本月纪念日列表:日期下方显示农历月日「X月X日」
- 公历事件用 solarToLunar 算当年对应农历
- 农历事件按当年公历落点反算农历(与原始农历一致)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:19:14 +08:00
yuming f0835726de 版本号显示 v2.1.4 → v2.1.5
部署到群晖 / deploy (push) Successful in 36s
带日历跨年修复的版本,重新上传体验版。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:36:28 +08:00
yuming 030e587480 修复日历跨年不显示纪念日
部署到群晖 / deploy (push) Successful in 40s
原 buildEventIndex / loadMonthEvents 用 a.solarYear === year 判断,
只匹配纪念日原始录入年份的那一年。生日/纪念日是周年性事件,应
每年这天都出现。

- 去掉 solarYear === year 判断
- 新增 getAnniversaryDateInYear():公历直接用 solarMonth/solarDay
- 农历用 lunarToSolar 重算当年公历,因农历对应公历每年浮动
- 当年无闰月时 lunarToSolar 自动忽略 isLeap 回退普通月

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:35:20 +08:00
yuming fb7b12ff76 版本号显示 v2.1.3 → v2.1.4
部署到群晖 / deploy (push) Successful in 48s
为即将上传的微信小程序新版做准备,保持「数据」页底部
版本号与微信后台一致。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 13:04:31 +08:00
yuming 3f30c9c017 修复 person-detail 按钮文字未居中
部署到群晖 / deploy (push) Successful in 40s
原因:微信 <button> 自带 min-height 88rpx 和固有 line-height,
会顶歪自定义高度。改用 <view> + flex 居中。

- 5 个 button 改为 view(保留 class/bindtap/data-id)
- action-btn / edit-btn / delete-btn 改 flex 居中
- add-btn 加 inline-flex 居中

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 12:54:27 +08:00
yuming fb036fd65f 设置页改造:「设置」→「数据」,做成数据中心
- tabBar 文字 ⚙️ 设置 → 💾 数据
- Header 收敛成 标题 + 一行统计 + 上次备份时间
- 删除「关于」「温馨提示」整块装饰内容
- 「数据管理」拆成「备份」+「危险操作」两组
- 导出成功后写入 lastBackupAt,进页面格式化展示
- 图标背景从冷色统一为纸感暖色
- 底部加版本号 v2.1.3 小字

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 12:54:20 +08:00
10 changed files with 173 additions and 210 deletions
+1 -1
View File
@@ -30,7 +30,7 @@
}, },
{ {
"pagePath": "pages/settings/settings", "pagePath": "pages/settings/settings",
"text": "⚙️ 设置" "text": "💾 数据"
} }
] ]
}, },
+29 -13
View File
@@ -1,8 +1,20 @@
// calendar.js // calendar.js
const storage = require('../../utils/storage') const storage = require('../../utils/storage')
const dateUtils = require('../../utils/date') const dateUtils = require('../../utils/date')
const lunar = require('../../utils/lunar')
const { TYPE_NAMES, TYPE_ICONS, IMPORTANCE_COLORS } = require('../../utils/constants') const { TYPE_NAMES, TYPE_ICONS, IMPORTANCE_COLORS } = require('../../utils/constants')
// 算出某条纪念日在指定年份的公历 (month, day)
// 公历纪念日:每年同月同日,直接用录入时的 solarMonth/solarDay
// 农历纪念日:把农历月日转回当年公历,因为农历对应的公历日期每年都不同
function getAnniversaryDateInYear(a, year) {
if (a.isLunar && a.lunarMonth && a.lunarDay) {
const date = lunar.lunarToSolar(year, a.lunarMonth, a.lunarDay, !!a.isLeapMonth)
return { month: date.getMonth() + 1, day: date.getDate() }
}
return { month: a.solarMonth, day: a.solarDay }
}
Page({ Page({
data: { data: {
currentYear: new Date().getFullYear(), currentYear: new Date().getFullYear(),
@@ -27,8 +39,9 @@ Page({
buildEventIndex(anniversaries, year, month) { buildEventIndex(anniversaries, year, month) {
const index = {} const index = {}
for (const a of anniversaries) { for (const a of anniversaries) {
if (a.solarYear === year && a.solarMonth === month) { const { month: m, day: d } = getAnniversaryDateInYear(a, year)
const key = String(a.solarDay) if (m === month) {
const key = String(d)
if (!index[key]) index[key] = [] if (!index[key]) index[key] = []
index[key].push(a) index[key].push(a)
} }
@@ -100,24 +113,27 @@ Page({
const persons = storage.getPersons() const persons = storage.getPersons()
const anniversaries = storage.getAnniversaries() const anniversaries = storage.getAnniversaries()
// 筛选本月纪念日
const monthEvents = anniversaries const monthEvents = anniversaries
.filter(a => a.solarYear === currentYear && a.solarMonth === currentMonth)
.map(a => { .map(a => {
const person = persons.find(p => p.id === a.personId) const { month: m, day: d } = getAnniversaryDateInYear(a, currentYear)
const date = new Date(currentYear, currentMonth - 1, a.solarDay) return { ...a, _displayMonth: m, _displayDay: d }
const daysUntil = dateUtils.getDaysUntil(date) })
.filter(x => x._displayMonth === currentMonth)
.map(x => {
const person = persons.find(p => p.id === x.personId)
const date = new Date(currentYear, x._displayMonth - 1, x._displayDay)
const ld = lunar.solarToLunar(date)
return { return {
...a, ...x,
personName: person ? person.name : '未知', personName: person ? person.name : '未知',
typeIcon: this.getTypeIcon(a.type), typeIcon: this.getTypeIcon(x.type),
typeName: a.customTypeName || this.getTypeName(a.type), typeName: x.customTypeName || this.getTypeName(x.type),
dateText: dateUtils.formatDate(date, 'MM月DD日'), dateText: dateUtils.formatDate(date, 'MM月DD日'),
daysUntil lunarMD: ld.lunarText,
daysUntil: dateUtils.getDaysUntil(date)
} }
}) })
.sort((a, b) => a.solarDay - b.solarDay) .sort((a, b) => a._displayDay - b._displayDay)
this.setData({ monthEvents }) this.setData({ monthEvents })
}, },
+4 -1
View File
@@ -40,7 +40,10 @@
<view class="event-header"> <view class="event-header">
<text class="event-icon">{{item.typeIcon}}</text> <text class="event-icon">{{item.typeIcon}}</text>
<text class="event-title">{{item.personName}} - {{item.typeName}}</text> <text class="event-title">{{item.personName}} - {{item.typeName}}</text>
<text class="event-date">{{item.dateText}}</text> <view class="event-date-group">
<text class="event-date">{{item.dateText}}</text>
<text class="event-lunar">{{item.lunarMD}}</text>
</view>
</view> </view>
<view class="event-info"> <view class="event-info">
<text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text> <text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text>
+14 -2
View File
@@ -249,11 +249,23 @@
white-space: nowrap; white-space: nowrap;
} }
.event-date-group {
display: flex;
flex-direction: column;
align-items: flex-end;
flex-shrink: 0;
margin-left: 12rpx;
gap: 2rpx;
}
.event-date { .event-date {
font-size: 24rpx; font-size: 24rpx;
color: #8A8278; color: #8A8278;
flex-shrink: 0; }
margin-left: 12rpx;
.event-lunar {
font-size: 20rpx;
color: #A9A096;
} }
.event-info { .event-info {
+3
View File
@@ -1,6 +1,7 @@
// person-detail.js // person-detail.js
const storage = require('../../utils/storage') const storage = require('../../utils/storage')
const dateUtils = require('../../utils/date') const dateUtils = require('../../utils/date')
const lunar = require('../../utils/lunar')
const fmt = require('../../utils/format') const fmt = require('../../utils/format')
Page({ Page({
@@ -52,11 +53,13 @@ Page({
const formatted = anniversaries.map(a => { const formatted = anniversaries.map(a => {
const date = new Date(a.solarYear, a.solarMonth - 1, a.solarDay) const date = new Date(a.solarYear, a.solarMonth - 1, a.solarDay)
const daysUntil = dateUtils.getDaysUntil(date) const daysUntil = dateUtils.getDaysUntil(date)
const ld = lunar.solarToLunar(date)
return { return {
...a, ...a,
date, date,
dateText: dateUtils.formatDate(date, 'YYYY年MM月DD日'), dateText: dateUtils.formatDate(date, 'YYYY年MM月DD日'),
lunarText: `农历 ${ld.year}${ld.lunarText}`,
daysUntil, daysUntil,
daysUntilAbs: Math.abs(daysUntil), daysUntilAbs: Math.abs(daysUntil),
typeIcon: fmt.getTypeIcon(a.type), typeIcon: fmt.getTypeIcon(a.type),
+10 -5
View File
@@ -12,8 +12,8 @@
<text wx:if="{{person.remark}}" class="person-remark">{{person.remark}}</text> <text wx:if="{{person.remark}}" class="person-remark">{{person.remark}}</text>
<view class="actions"> <view class="actions">
<button class="action-btn" bindtap="onEditPerson">编辑</button> <view class="action-btn" bindtap="onEditPerson">编辑</view>
<button class="action-btn danger" bindtap="onDeletePerson">删除</button> <view class="action-btn danger" bindtap="onDeletePerson">删除</view>
</view> </view>
</view> </view>
@@ -21,7 +21,7 @@
<view class="section"> <view class="section">
<view class="section-header"> <view class="section-header">
<text class="section-title">纪念日列表 ({{anniversaries.length}})</text> <text class="section-title">纪念日列表 ({{anniversaries.length}})</text>
<button class="add-btn" bindtap="onAddAnniversary">+ 添加纪念日</button> <view class="add-btn" bindtap="onAddAnniversary">+ 添加纪念日</view>
</view> </view>
<view wx:if="{{anniversaries.length === 0}}" class="empty-state"> <view wx:if="{{anniversaries.length === 0}}" class="empty-state">
@@ -44,6 +44,11 @@
<text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text> <text wx:if="{{item.isLunar}}" class="lunar-badge">农历</text>
</view> </view>
<view class="anniversary-lunar">
<text class="lunar-icon">🌙</text>
<text class="lunar-text">{{item.lunarText}}</text>
</view>
<view wx:if="{{item.daysUntil !== undefined}}" class="days-info"> <view wx:if="{{item.daysUntil !== undefined}}" class="days-info">
<text wx:if="{{item.daysUntil === 0}}" class="days-text urgent">今天</text> <text wx:if="{{item.daysUntil === 0}}" class="days-text urgent">今天</text>
<text wx:elif="{{item.daysUntil === 1}}" class="days-text warning">明天</text> <text wx:elif="{{item.daysUntil === 1}}" class="days-text warning">明天</text>
@@ -54,8 +59,8 @@
<view wx:if="{{item.remark}}" class="anniversary-remark">{{item.remark}}</view> <view wx:if="{{item.remark}}" class="anniversary-remark">{{item.remark}}</view>
<view class="anniversary-actions"> <view class="anniversary-actions">
<button class="edit-btn" bindtap="onEditAnniversary" data-id="{{item.id}}">编辑</button> <view class="edit-btn" bindtap="onEditAnniversary" data-id="{{item.id}}">编辑</view>
<button class="delete-btn" bindtap="onDeleteAnniversary" data-id="{{item.id}}">删除</button> <view class="delete-btn" bindtap="onDeleteAnniversary" data-id="{{item.id}}">删除</view>
</view> </view>
</view> </view>
</view> </view>
+25 -4
View File
@@ -68,7 +68,9 @@
.action-btn { .action-btn {
flex: 1; flex: 1;
height: 72rpx; height: 72rpx;
line-height: 72rpx; display: flex;
align-items: center;
justify-content: center;
border-radius: 12rpx; border-radius: 12rpx;
font-size: 26rpx; font-size: 26rpx;
font-weight: 500; font-weight: 500;
@@ -122,8 +124,11 @@
color: #FAF6ED; color: #FAF6ED;
border-radius: 36rpx; border-radius: 36rpx;
font-size: 22rpx; font-size: 22rpx;
border: none;
font-weight: 500; font-weight: 500;
display: inline-flex;
align-items: center;
justify-content: center;
line-height: 1.4;
} }
.add-btn::after { .add-btn::after {
@@ -188,11 +193,25 @@
} }
.anniversary-date { .anniversary-date {
margin-bottom: 12rpx; margin-bottom: 8rpx;
font-size: 24rpx; font-size: 24rpx;
color: #5A5247; color: #5A5247;
} }
.anniversary-lunar {
display: flex;
align-items: center;
gap: 8rpx;
margin-bottom: 12rpx;
font-size: 22rpx;
color: #8A8278;
}
.lunar-icon {
font-size: 20rpx;
opacity: 0.7;
}
.date-label { .date-label {
color: #8A8278; color: #8A8278;
} }
@@ -258,7 +277,9 @@
.delete-btn { .delete-btn {
flex: 1; flex: 1;
height: 60rpx; height: 60rpx;
line-height: 60rpx; display: flex;
align-items: center;
justify-content: center;
border-radius: 10rpx; border-radius: 10rpx;
font-size: 22rpx; font-size: 22rpx;
border: 1rpx solid #E8E2D5; border: 1rpx solid #E8E2D5;
+27 -31
View File
@@ -1,50 +1,56 @@
// settings.js // settings.js
const storage = require('../../utils/storage') const storage = require('../../utils/storage')
const LAST_BACKUP_KEY = 'lastBackupAt'
function formatRelativeTime(ts) {
if (!ts) return '从未备份'
const diff = Date.now() - ts
if (diff < 60 * 1000) return '刚刚'
if (diff < 60 * 60 * 1000) return Math.floor(diff / 60000) + ' 分钟前'
if (diff < 24 * 60 * 60 * 1000) return Math.floor(diff / 3600000) + ' 小时前'
if (diff < 30 * 24 * 60 * 60 * 1000) return Math.floor(diff / 86400000) + ' 天前'
const d = new Date(ts)
return (d.getMonth() + 1) + '月' + d.getDate() + '日'
}
Page({ Page({
data: { data: {
dataCount: { personsCount: 0,
persons: 0, anniversariesCount: 0,
anniversaries: 0 lastBackupText: '从未备份',
} version: 'v2.1.6'
}, },
onLoad() { onLoad() {
this.loadDataCount() this.loadSummary()
}, },
onShow() { onShow() {
this.loadDataCount() this.loadSummary()
}, },
/** loadSummary() {
* 加载数据统计
*/
loadDataCount() {
const persons = storage.getPersons() const persons = storage.getPersons()
const anniversaries = storage.getAnniversaries() const anniversaries = storage.getAnniversaries()
const lastBackupAt = wx.getStorageSync(LAST_BACKUP_KEY) || 0
this.setData({ this.setData({
dataCount: { personsCount: persons.length,
persons: persons.length, anniversariesCount: anniversaries.length,
anniversaries: anniversaries.length lastBackupText: formatRelativeTime(lastBackupAt)
}
}) })
}, },
/**
* 导出数据
*/
onExportData() { onExportData() {
const data = storage.exportData() const data = storage.exportData()
// 转换为JSON字符串
const jsonStr = JSON.stringify(data, null, 2) const jsonStr = JSON.stringify(data, null, 2)
// 在小程序中,可以通过提示用户复制
wx.setClipboardData({ wx.setClipboardData({
data: jsonStr, data: jsonStr,
success: () => { success: () => {
wx.setStorageSync(LAST_BACKUP_KEY, Date.now())
this.loadSummary()
wx.showToast({ wx.showToast({
title: '数据已复制到剪贴板', title: '数据已复制到剪贴板',
icon: 'success' icon: 'success'
@@ -53,9 +59,6 @@ Page({
}) })
}, },
/**
* 导入数据
*/
onImportData() { onImportData() {
wx.showModal({ wx.showModal({
title: '导入数据', title: '导入数据',
@@ -64,7 +67,6 @@ Page({
cancelText: '取消', cancelText: '取消',
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
// 读取剪贴板
wx.getClipboardData({ wx.getClipboardData({
success: (res) => { success: (res) => {
try { try {
@@ -87,25 +89,20 @@ Page({
}) })
}, },
/**
* 清空所有数据
*/
onClearData() { onClearData() {
wx.showModal({ wx.showModal({
title: '确认清空', title: '确认清空',
content: '确定要清空所有数据吗?此操作不可恢复!', content: '确定要清空所有数据吗?此操作不可恢复!',
confirmText: '确认清空', confirmText: '确认清空',
confirmColor: '#ff5722', confirmColor: '#C8412F',
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
const success = storage.clearAllData() const success = storage.clearAllData()
if (success) { if (success) {
wx.showToast({ wx.showToast({
title: '已清空', title: '已清空',
icon: 'success' icon: 'success'
}) })
setTimeout(() => { setTimeout(() => {
wx.reLaunch({ wx.reLaunch({
url: '/pages/index/index' url: '/pages/index/index'
@@ -117,4 +114,3 @@ Page({
}) })
} }
}) })
+23 -71
View File
@@ -5,37 +5,29 @@
<view class="header"> <view class="header">
<view class="header-top"> <view class="header-top">
<view class="header-left"> <view class="header-left">
<text class="header-title">设置</text> <text class="header-title">数据</text>
<text class="header-sub">数据管理与关于</text> <text class="header-sub">{{personsCount}} 位好友 · {{anniversariesCount}} 个纪念日</text>
</view> </view>
<view class="header-icon">⚙️</view> <view class="header-icon">💾</view>
</view> </view>
<!-- 数据统计 --> <view class="header-meta">
<view class="stats-row"> <text class="meta-label">上次备份</text>
<view class="stat-item"> <text class="meta-value">{{lastBackupText}}</text>
<text class="stat-num">{{dataCount.persons}}</text>
<text class="stat-label">位好友</text>
</view>
<view class="stat-sep"></view>
<view class="stat-item">
<text class="stat-num">{{dataCount.anniversaries}}</text>
<text class="stat-label">个纪念日</text>
</view>
</view> </view>
</view> </view>
<scroll-view class="body" scroll-y> <scroll-view class="body" scroll-y>
<!-- 数据管理 --> <!-- 备份 -->
<view class="section-label">数据管理</view> <view class="section-label">备份</view>
<view class="card-group"> <view class="card-group">
<view class="row" bindtap="onExportData"> <view class="row" bindtap="onExportData">
<view class="row-icon-wrap" style="background:#fff7ed;"> <view class="row-icon-wrap">
<text class="row-icon">📤</text> <text class="row-icon">📤</text>
</view> </view>
<view class="row-body"> <view class="row-body">
<text class="row-title">导出数据</text> <text class="row-title">导出到剪贴板</text>
<text class="row-desc">复制 JSON 到剪贴板</text> <text class="row-desc">复制 JSON,粘贴到备忘录或邮件保存</text>
</view> </view>
<text class="row-arrow"></text> <text class="row-arrow"></text>
</view> </view>
@@ -43,74 +35,34 @@
<view class="row-divider"></view> <view class="row-divider"></view>
<view class="row" bindtap="onImportData"> <view class="row" bindtap="onImportData">
<view class="row-icon-wrap" style="background:#eff6ff;"> <view class="row-icon-wrap">
<text class="row-icon">📥</text> <text class="row-icon">📥</text>
</view> </view>
<view class="row-body"> <view class="row-body">
<text class="row-title">导入数据</text> <text class="row-title">从剪贴板恢复</text>
<text class="row-desc">剪贴板读取并导入</text> <text class="row-desc">读取剪贴板内容并覆盖本地数据</text>
</view> </view>
<text class="row-arrow"></text> <text class="row-arrow"></text>
</view> </view>
</view>
<view class="row-divider"></view> <!-- 危险操作 -->
<view class="section-label danger-label">危险操作</view>
<view class="card-group">
<view class="row" bindtap="onClearData"> <view class="row" bindtap="onClearData">
<view class="row-icon-wrap" style="background:#fff1f2;"> <view class="row-icon-wrap danger-icon-wrap">
<text class="row-icon">🗑</text> <text class="row-icon">🗑</text>
</view> </view>
<view class="row-body"> <view class="row-body">
<text class="row-title danger">清空所有数据</text> <text class="row-title danger">清空所有数据</text>
<text class="row-desc danger">此操作不可恢复,请谨慎</text> <text class="row-desc danger">此操作不可恢复,请先导出备份</text>
</view> </view>
<text class="row-arrow danger"></text> <text class="row-arrow danger"></text>
</view> </view>
</view> </view>
<!-- 关于 --> <view class="footer">
<view class="section-label">关于</view> <text class="footer-version">{{version}}</text>
<view class="card-group">
<view class="row">
<view class="row-icon-wrap" style="background:#f0fdf4;">
<text class="row-icon">📱</text>
</view>
<view class="row-body">
<text class="row-title">版本号</text>
</view>
<text class="row-value">v1.0.0</text>
</view>
<view class="row-divider"></view>
<view class="row">
<view class="row-icon-wrap" style="background:#faf5ff;">
<text class="row-icon">👨‍💻</text>
</view>
<view class="row-body">
<text class="row-title">开发作者</text>
</view>
<text class="row-value">生日提醒团队</text>
</view>
</view>
<!-- 提示 -->
<view class="tips-card">
<view class="tips-title">
<text class="tips-icon">💡</text>
<text class="tips-heading">温馨提示</text>
</view>
<view class="tips-item">
<text class="tips-dot">·</text>
<text class="tips-text">建议定期导出数据备份</text>
</view>
<view class="tips-item">
<text class="tips-dot">·</text>
<text class="tips-text">农历转换使用寿星万年历算法(19002100</text>
</view>
<view class="tips-item">
<text class="tips-dot">·</text>
<text class="tips-text">开启提醒需授权订阅消息</text>
</view>
</view> </view>
<view class="bottom-pad"></view> <view class="bottom-pad"></view>
+32 -77
View File
@@ -1,5 +1,6 @@
/* settings.wxss /* settings.wxss
* 视觉方向:纸感编辑风(A 方案,与首页/日历一致) * 视觉方向:纸感编辑风(A 方案,与全局一致)
* 定位:数据中心(备份 + 危险操作 + 版本号)
*/ */
page { page {
@@ -23,7 +24,7 @@ page {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
justify-content: space-between; justify-content: space-between;
margin-bottom: 28rpx; margin-bottom: 20rpx;
} }
.header-left { .header-left {
@@ -50,36 +51,24 @@ page {
opacity: 0.85; opacity: 0.85;
} }
.stats-row { .header-meta {
display: flex; display: flex;
gap: 64rpx; align-items: baseline;
padding-top: 12rpx; gap: 12rpx;
padding-top: 20rpx;
border-top: 1rpx solid #E8E2D5; border-top: 1rpx solid #E8E2D5;
padding-top: 24rpx;
margin-top: 4rpx;
} }
.stat-item { .meta-label {
display: flex; font-size: 22rpx;
flex-direction: column; color: #A9A096;
gap: 4rpx; letter-spacing: 1rpx;
} }
.stat-num { .meta-value {
font-size: 44rpx;
font-weight: 600;
color: #1F1D2B;
line-height: 1;
letter-spacing: -1rpx;
}
.stat-label {
font-size: 24rpx; font-size: 24rpx;
color: #8A8278; color: #1F1D2B;
} font-weight: 500;
.stat-sep {
display: none;
} }
/* ───── Body ───── */ /* ───── Body ───── */
@@ -98,6 +87,10 @@ page {
text-transform: uppercase; text-transform: uppercase;
} }
.section-label.danger-label {
color: #C8412F;
}
/* ───── Card group ───── */ /* ───── Card group ───── */
.card-group { .card-group {
background: #FFFFFF; background: #FFFFFF;
@@ -123,6 +116,7 @@ page {
width: 64rpx; width: 64rpx;
height: 64rpx; height: 64rpx;
border-radius: 14rpx; border-radius: 14rpx;
background: #F2EEE5;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -130,6 +124,10 @@ page {
margin-right: 20rpx; margin-right: 20rpx;
} }
.row-icon-wrap.danger-icon-wrap {
background: #FFF1EA;
}
.row-icon { .row-icon {
font-size: 32rpx; font-size: 32rpx;
} }
@@ -139,6 +137,7 @@ page {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 4rpx; gap: 4rpx;
min-width: 0;
} }
.row-title { .row-title {
@@ -170,66 +169,22 @@ page {
color: #E29F92; color: #E29F92;
} }
.row-value {
font-size: 26rpx;
color: #8A8278;
}
.row-divider { .row-divider {
height: 1rpx; height: 1rpx;
background: #E8E2D5; background: #E8E2D5;
margin-left: 112rpx; margin-left: 112rpx;
} }
/* ───── Tips card ───── */ /* ───── Footer ───── */
/* 删原 border-left 6rpx 紫色条(禁项),改全边线 + 浅暖底标识 */ .footer {
.tips-card { text-align: center;
background: #FFF8EE; padding: 48rpx 0 16rpx;
border: 1rpx solid #EFD9B5;
border-radius: 14rpx;
margin: 12rpx 24rpx 0;
padding: 24rpx 28rpx 28rpx;
} }
.tips-title { .footer-version {
display: flex; font-size: 22rpx;
align-items: center; color: #C8C2B4;
gap: 12rpx; letter-spacing: 2rpx;
margin-bottom: 16rpx;
}
.tips-icon {
font-size: 30rpx;
}
.tips-heading {
font-size: 26rpx;
font-weight: 600;
color: #1F1D2B;
}
.tips-item {
display: flex;
align-items: flex-start;
gap: 12rpx;
margin-bottom: 10rpx;
}
.tips-item:last-child {
margin-bottom: 0;
}
.tips-dot {
font-size: 26rpx;
color: #B36A1F;
line-height: 1.8;
flex-shrink: 0;
}
.tips-text {
font-size: 24rpx;
color: #5A5247;
line-height: 1.7;
} }
/* ───── Bottom padding ───── */ /* ───── Bottom padding ───── */