Skip to content

Commit 2e225db

Browse files
authored
test/docs: 补充 WalletConfig 测试和白皮书文档 (#127)
* feat(wallet): 三页合一 - 3D钱包卡片、轮播、动态主题色 BREAKING CHANGE: 移除首页/转账/钱包三个独立tab,合并为统一的钱包页面 新增功能: - 3D钱包卡片,支持重力感应和触摸交互的倾斜效果 - 炫光防伪层,彩虹折射效果随手指/设备移动 - Swiper轮播切换多个钱包 - 每个钱包可独立设置主题色,影响全局primary颜色 - 资产/交易Tab切换,支持滑动动画 - 钱包列表Sheet,支持快速切换和主题色选择 新增组件: - WalletCard: 3D卡片组件 - WalletCardCarousel: Swiper轮播组件 - WalletListSheet: 钱包列表Sheet - ContentTabs/SwipeableContentTabs: Tab切换组件 - useCardInteraction: 重力感应+触摸hook - useWalletTheme: 主题色管理hook UI变更: - TabBar从4个tab简化为2个(钱包/设置) - globals.css添加动态--primary-hue CSS变量 测试覆盖: - 新增6个单元测试文件 - 新增4个Storybook stories - 新增1个E2E测试文件 * fix: 修复类型错误和测试问题 - 修复 WalletInfo 类型兼容性,保留向后兼容接口 - 修复 WalletCardProps 可选属性的精确类型 - 修复数组索引可能为 undefined 的问题 - 修复未使用导入的警告 - 修复 useCardInteraction 中 touches[0] 可能为 undefined 的问题 - 修复 ringColor CSS 属性问题,改用 --tw-ring-color CSS变量 - 从 index.ts 导出 WalletSelector 组件 * refactor: 清理残留的 tanstack-router 代码,修复 stackflow 路由 - 删除未使用的 src/routes/ 目录(tanstack-router) - 删除未使用的 app-layout.tsx - 删除未使用的 pages/home/index.tsx - 修改正确的 stackflow TabBar:4 tabs → 2 tabs - 修改 MainTabsActivity:移除 HomeTab/TransferTab - 重写 WalletTab:集成 3D 卡片轮播、资产/交易 Tab * refactor: 使用 stackflow Job 模式重构钱包列表底部弹窗 - 创建 WalletListJob 替代 WalletListSheet - 在 stackflow.ts 注册新的 Job 路由 - 更新 WalletTab 使用 push('WalletListJob') 打开钱包列表 - 删除不再使用的 wallet-list-sheet 组件及其测试/story * fix: 优化3D卡片视觉效果和主题色跟随 - 卡片添加默认光泽层(不依赖交互也可见) - 添加彩虹全息效果、噪点纹理、边缘高光 - 添加微弱呼吸动画增加动态感 - 快捷按钮颜色跟随 --primary-hue 主题色 - 增大卡片尺寸 280x180 → 340x200 - 分页指示器跟随主题色 - 导出 WALLET_THEME_COLORS 供钱包列表使用 * fix: 修复主题色跟随和间距问题 - 主题色根据钱包索引自动分配(无需手动设置) - 减少卡片区域、快捷按钮、Tab栏之间的间距 - Tab指示器和文字颜色跟随主题色 - 快捷按钮颜色跟随主题色 - 优化整体布局紧凑度 * fix: 优化卡片尺寸、防伪图层和多钱包入口位置 - 卡片尺寸增大: 340x200 → 380x220 - 防伪图层增强: 斜纹底纹 + 细密网格 + 大Logo水印 - 移除 Swiper 分页指示器 - 多钱包管理入口移至左上角,带钱包图标 * fix: 修复重力感应和卡片尺寸问题 - 重力感应时也设置 isActive=true,让卡片能响应倾斜 - 卡片使用 h-full w-full 填满 Swiper slide - Swiper slide 使用 !important 强制 100% 宽高 - 调整卡片尺寸为 360x212px (1.7:1比例) * refactor: 移除卡片呼吸动画,已有重力感应 * feat: 添加全息防伪水印效果 - 用链 logo 作为 CSS mask 平铺 - 彩虹折射层跟随指针/重力移动 - 新增 watermarkLogoSize 参数控制 logo 平铺尺寸(默认 32px) - 从 chainConfigs 获取链图标 URL * fix: 修复防伪水印效果 1. 添加 logo 间距 - watermarkLogoSize(40px) vs watermarkLogoActualSize(24px) 2. 生成黑白透明遮罩 - useMonochromeMask hook 将彩色 logo 转为亮度透明 3. 独立渲染上下文 - 添加 isolation: isolate 确保每个卡片混合模式独立 4. 每个钱包独立链偏好 - 使用 chainPreferences 让每个卡片显示自己的链 5. 添加 useChainPreferences hook * fix: 修复防伪折射层截断问题 - 使用 radial-gradient at 动态位置代替 scale+translate - 渐变始终覆盖整个卡片区域,通过移动渐变中心点实现动态效果 - 避免了边缘截断的视觉问题 * feat: 实现原版防伪效果 - 双层纹理 + 默认无色 1. 三角形底纹层 - 灰色背景 + 小三角形 mask,mix-blend-mode: multiply 2. Logo 水印层 - 白色半透明背景 + logo mask,默认可见(灰色) 3. 彩虹折射层 - 默认 opacity: 0,只有激活时才显示彩虹色 * refactor: 按照简化 DEMO 重新实现防伪效果 关键改进: 1. mix-blend-mode: color-dodge - 深色背景下透明,有亮光时显色 2. 线性渐变 200% 大小 - 通过 translate 移动产生视差 3. 动态透明度 - opacity: 0.1 + max(abs(x), abs(y)) * 0.9 默认几乎不可见,倾斜越大越亮 4. 双层纹理:三角底纹(color-dodge) + Logo水印(overlay) 5. 表面高光 glare - radial-gradient 跟随指针 * refactor: 优化防伪效果 - 使用 hypot 控制显影强度 关键改进: 1. hypot = sqrt(x² + y²) - 移动幅度控制显影强度 2. 三角纹理层:默认 opacity: 0.2,激活时 0.3 + hypot * 0.7 3. Logo 水印层:默认 opacity: 0(完全隐藏),激活时 hypot * 0.8 4. 径向渐变 + blur(20px) - 更柔和的光栅效果 5. Logo 层使用金色渐变,与三角层差异化 6. 高光层 opacity 也由 hypot 控制 * fix: 调整防伪效果 1. 使用 DEMO 的 figma-texture.png 作为三角纹理 2. 降低三角层强度:默认 0.15,激活 0.2 + hypot * 0.5 3. 提高 Logo 层强度:默认 0,激活 0.2 + hypot * 0.8 * fix: 使用直角三角形纹理(直角边在横轴和纵轴) SVG 路径: M0 10 L10 10 L10 0 Z - 底边(水平)+ 右边(垂直)= 直角 - 平铺后形成类似正方形的层叠效果 * perf: 优化动画性能 1. 添加 will-change: transform 到需要动画的元素 2. 抽取静态样式常量(TRIANGLE_MASK_SVG, REFRACTION_GRADIENT, GOLD_GRADIENT) 3. 使用 useMemo 缓存 bgGradient 和 logoMaskStyle 4. 移除不必要的 transition(opacity 变化由 React 重渲染驱动) * refactor: 使用 AddressDisplay 组件的响应式显示 - 用 AddressDisplay (copyable={false}) 替换手动截断 - 保留原有的复制按钮 - 删除不再使用的 truncateAddress 函数 * fix: 切换钱包时 --primary-hue 没有更新 问题:useWalletTheme 中的 themeHue 直接读取 wallet.themeHue, 如果没有就用默认值,而不是像 getWalletTheme 那样根据索引选择。 修复:抽取 getThemeHueForWallet 函数,统一 themeHue 和 getWalletTheme 的逻辑, 都是先检查存储的值,没有的话根据钱包索引从预设中选择。 * style: 钱包管理按钮使用 primary 风格 * refactor: 将 style 标签转换为 tailwind 类 - .wallet-carousel → w-full pt-8 pb-2 - .wallet-swiper → mx-auto h-[212px] w-[min(92vw,360px)] overflow-visible - .swiper-slide → [&_.swiper-slide]:size-full [&_.swiper-slide]:rounded-2xl * refactor: 使用主题变量 bg-primary/10 text-primary 替代自定义 oklch 遵循主题系统,不再自定义 lightness/chroma,直接用 --primary 配合透明度 * fix: 卡片背景渐变使用 oklch 替代 hsl * fix: 交易历史按当前选中的链过滤 * feat: 交易列表添加'查看更多'入口 - 首页交易列表只显示最近 5 条 - 超过 5 条时显示'查看全部 N 条记录'按钮 - 点击进入完整的交易历史页面(含过滤器) * fix: 添加缺失的 useEffect 导入 * fix: 始终显示查看全部交易按钮 - 有记录时显示'查看全部 N 条记录' - 无记录时显示'查看全部网络交易' * feat: History页面支持传递初始链过滤参数 - HistoryActivity 支持 chain 参数 - TransactionHistoryPage 接收 initialChain prop - 有记录时传递当前链,无记录时传递 'all' * feat: 交易列表支持显示链图标 - TransactionInfo 添加 chain 字段 - TransactionItem 添加 showChainIcon prop - 链图标显示在类型图标右下角(类似 TokenIcon) - History 页面启用 showChainIcon * fix: 修复类型错误 - useMonochromeMask: 添加亮度归一化,映射到完整 0~255 范围 - useWalletTheme: 添加默认值防止 undefined - TransactionHistoryPageProps: 添加 undefined 类型 - WalletListJob: 使用 getWalletTheme 获取主题色 - WalletTab: 移除未使用的 ChainType 导入 * feat: 禁用右键菜单事件 * fix: 修复 history 页面 select 显示问题,添加配套 Label * fix: 移除 SelectValue 不支持的 placeholder 属性 * refactor: 基于物理角度重构卡片光影算法 - 使用倾斜角度(tiltX/Y)替代指针位置计算光影效果 - 添加菲涅尔效应:倾斜角度越大,反射越强 - 高光位置基于入射角=反射角原理移动 - 彩虹色带随倾斜方向旋转,模拟光栅衍射 - 各层透明度基于物理角度而非距离 * fix: 使用CSS变量统一驱动光影动画,与卡片回弹同步 - 所有光影效果通过 CSS 变量 (--tilt-x/y/intensity) 驱动 - 统一过渡配置: cubic-bezier(0.34, 1.56, 0.64, 1) 回弹曲线 - 激活时无过渡(即时响应),松手时 GPU 驱动动画回弹 - 高光、透明度、视差位移都与卡片旋转同步过渡 * fix: 注册CSS自定义属性使其可动画插值 使用 CSS.registerProperty 注册 --tilt-* 变量为 <number> 类型, 使浏览器能够对其进行插值动画 * fix: 为Logo水印添加基础透明度,确保静止时可见 * fix: 覆盖 Swiper slide 的 overflow:hidden,避免裁剪 3D 变换 * refactor: 使用双层折射重构卡片光影效果 * feat: 添加钱包主题色选择功能 - Wallet 类型添加必需的 themeHue 属性 - 基于助记词/密钥稳定派生默认主题色 - 创建和导入钱包流程增加主题色选择步骤 - 添加 ThemeSelector 组件支持预览和选择 * feat: 添加清空应用数据功能 - 新增 ClearDataConfirmJob 确认弹窗 - 设置页面添加清空数据入口 - 清空 localStorage/sessionStorage/IndexedDB * refactor: 将清空数据功能移至存储空间页面 - 新增存储空间页面,显示 navigator.storage.estimate() 配额信息 - 设置页面 -> 关于 -> 存储空间 - 存储页面显示使用率进度条和详细信息 - 清理数据按钮移至存储页面 - 修复路由映射缺失问题 * refactor: 使用 Vite 多入口配置清理数据页面 - 创建 clear.html 和 src/clear/ 作为独立入口 - 配置 vite.config.ts rollupOptions.input 多入口 - 使用 TypeScript 重写清理逻辑 - 修复 check 图标意外旋转问题 * feat: 统一钱包配置组件与主题色增强 WalletConfig 组件: - 三模式支持 (edit-only/default/edit) - 实时名称和主题色预览 - 嵌入创建/恢复流程最后一步 主题色系统: - deriveThemeHue() 从地址稳定派生主题色 - 动态 --primary-hue CSS 变量 - 确认/保存按钮跟随主题色 UI 增强: - 彩虹渐变进度条 (animate-rainbow-flow) - useChainIconUrls hook 统一链图标 - 触摸手势隔离 (touch-none + stopPropagation) 重构: - WalletDetailActivity → WalletConfigActivity - 简化 WalletCardCarousel 内部使用 hook - 删除 HomeTab/TransferTab 等未使用组件 * feat: 使用 @Property 注册 --primary* CSS 属性类型 注册 5 个可继承的 CSS 自定义属性: - --primary-hue: <number> - --primary-saturation: <number> - --primary-lightness: <number> - --primary: <color> - --primary-foreground: <color> 支持 CSS 动画过渡和属性继承 * fix: 修复 WalletConfig 链网络切换 - 使用 useSelectedChain() 替代 chainAddresses[0] - 同步修复 --primary CSS 变量覆盖 * fix: 修复进度条彩虹效果和 recover 页面缺失进度条 1. ProgressSteps 最后一步始终显示彩虹渐变 - 激活时: 彩虹流动动画 - 非激活时: 静态彩虹渐变,轻微淡化 (opacity: 0.6, 降低饱和度) 2. recover.tsx 添加 ProgressSteps 进度条 - 5步流程: keyType -> mnemonic/arbitrary -> pattern -> chains -> theme - collision 步骤共用第2步指示 * fix: 补全 zh-TW 和 ar 语言的缺失翻译 添加以下缺失的 i18n 键: - common: a11y.addWallet - onboarding: create.themeTitle/themeSubtitle, theme.* - settings: items.storage/clearData, clearData.*, storage.* - wallet: defaultName, detail.editTheme/editTitle * fix: 补全 en 语言的缺失翻译 添加 onboarding.theme.* 和 wallet.defaultName/detail.editTheme/editTitle * fix: 修复单元测试 - step-indicator: 更新彩虹渐变测试断言 - wallet-card-carousel: 单钱包不显示计数按钮,修复 chainPreferences 测试 * fix: 修复 wallet-card 和 content-tabs 单元测试 - wallet-card: 更新地址显示、主题色和透视容器测试 - content-tabs: 修复活动标签和圆角指示器类名 * fix: 修复 step-indicator 测试 TypeScript 类型错误 * test/docs: 补充 WalletConfig 测试和白皮书文档 测试: - wallet-config.test.tsx: 20 个单元测试覆盖三种模式 - useChainIconUrls.test.ts: 5 个 hook 测试 - wallet-config.stories.tsx: 5 个 Storybook 故事 白皮书: - 更新 WalletCard.md: 3D 效果、主题色、防伪水印规范 - 新建 WalletConfig.md: 三模式配置组件文档 - 更新 theme-colors.md: 添加钱包个性化主题色章节
1 parent e6452f1 commit 2e225db

File tree

6 files changed

+1084
-76
lines changed

6 files changed

+1084
-76
lines changed

docs/white-book/02-设计篇/02-视觉设计/theme-colors.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,112 @@ shadcn/ui 使用**配色对**设计,每个颜色变量都有对应的 `xxx-for
234234

235235
---
236236

237+
## 钱包个性化主题色
238+
239+
### 概述
240+
241+
每个钱包拥有独立的主题色(色相值 0-360),用于:
242+
- 钱包卡片渐变背景
243+
- 确认/保存按钮动态颜色
244+
- 视觉区分多个钱包
245+
246+
### CSS 自定义属性
247+
248+
```css
249+
@property --primary-hue {
250+
syntax: "<number>";
251+
inherits: true;
252+
initial-value: 323;
253+
}
254+
255+
@property --primary-lightness {
256+
syntax: "<number>";
257+
inherits: true;
258+
initial-value: 0.59;
259+
}
260+
261+
@property --primary-saturation {
262+
syntax: "<number>";
263+
inherits: true;
264+
initial-value: 0.26;
265+
}
266+
```
267+
268+
### 动态主题色应用
269+
270+
```tsx
271+
// 按钮跟随钱包主题色
272+
<Button
273+
style={{
274+
'--primary-hue': wallet.themeHue,
275+
'--primary': `oklch(var(--primary-lightness) var(--primary-saturation) ${wallet.themeHue})`,
276+
}}
277+
>
278+
确认
279+
</Button>
280+
```
281+
282+
### 色相派生算法
283+
284+
从钱包地址稳定派生初始色相,确保跨设备一致:
285+
286+
```typescript
287+
function deriveThemeHue(address: string): number {
288+
let hash = 0;
289+
for (let i = 0; i < address.length; i++) {
290+
hash = (hash << 5) - hash + address.charCodeAt(i);
291+
hash = hash & hash;
292+
}
293+
return ((hash % 360) + 360) % 360;
294+
}
295+
```
296+
297+
### 预设颜色
298+
299+
提供 12 个预设色相,覆盖色轮主要区域:
300+
301+
```typescript
302+
const WALLET_THEME_COLORS = [
303+
{ hue: 0, name: '红色' },
304+
{ hue: 30, name: '橙色' },
305+
{ hue: 60, name: '黄色' },
306+
{ hue: 90, name: '黄绿' },
307+
{ hue: 120, name: '绿色' },
308+
{ hue: 150, name: '青绿' },
309+
{ hue: 180, name: '青色' },
310+
{ hue: 210, name: '天蓝' },
311+
{ hue: 240, name: '蓝色' },
312+
{ hue: 270, name: '紫色' },
313+
{ hue: 300, name: '品红' },
314+
{ hue: 330, name: '玫红' },
315+
];
316+
```
317+
318+
### 趋避算法
319+
320+
为避免多钱包颜色相近,选择器会:
321+
1. 显示已用色相标记
322+
2. 降低相近颜色(距离 < 30°)的视觉权重
323+
324+
```typescript
325+
function calculateAvoidanceWeight(hue: number, existingHues: number[]): number {
326+
const minDistance = 30;
327+
let minDist = 180;
328+
329+
for (const existing of existingHues) {
330+
const dist = Math.min(Math.abs(hue - existing), 360 - Math.abs(hue - existing));
331+
if (dist < minDist) minDist = dist;
332+
}
333+
334+
return minDist < minDistance ? minDist / minDistance : 1;
335+
}
336+
```
337+
338+
---
339+
237340
## 相关链接
238341

239342
- [shadcn/ui 主题文档](https://ui.shadcn.com/docs/theming)
240343
- [Tailwind CSS 颜色](https://tailwindcss.com/docs/customizing-colors)
344+
- [WalletCard 组件](../../05-组件篇/03-钱包组件/WalletCard.md)
345+
- [WalletConfig 组件](../../05-组件篇/03-钱包组件/WalletConfig.md)

0 commit comments

Comments
 (0)