diff --git a/components/ClayButton.vue b/components/ClayButton.vue
new file mode 100644
index 0000000..4adafe3
--- /dev/null
+++ b/components/ClayButton.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+ {{ icon }}
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
diff --git a/components/ClayCard.vue b/components/ClayCard.vue
new file mode 100644
index 0000000..99090f5
--- /dev/null
+++ b/components/ClayCard.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ClayInput.vue b/components/ClayInput.vue
new file mode 100644
index 0000000..6b24fcb
--- /dev/null
+++ b/components/ClayInput.vue
@@ -0,0 +1,282 @@
+
+
+
+
+ {{ prefixIcon }}
+
+
+
+
+
+
+
+ ×
+ {{ suffixIcon }}
+
+
+
+
+ {{ errorText }}
+
+
+
+
+
+
+
diff --git a/components/app-tab-bar.vue b/components/app-tab-bar.vue
index 8768c7a..c313ee0 100644
--- a/components/app-tab-bar.vue
+++ b/components/app-tab-bar.vue
@@ -1,23 +1,31 @@
-
-
-
+
+
+
+
+
首页
-
-
+
+
+
+
商城
-
-
+
+
+
+
盒柜
-
-
+
+
+
+
我的
@@ -63,19 +71,30 @@ export default {
diff --git a/components/clay-components.js b/components/clay-components.js
new file mode 100644
index 0000000..03de56d
--- /dev/null
+++ b/components/clay-components.js
@@ -0,0 +1,69 @@
+/**
+ * Claymorphism 组件库导出
+ *
+ * 使用方式(在 pages.json 中配置 easycom):
+ * {
+ * "easycom": {
+ * "autoscan": true,
+ * "custom": {
+ * "^Clay(A.*)": "@/components/Clay$1.vue"
+ * }
+ * }
+ * }
+ *
+ * 或手动导入:
+ * import ClayCard from '@/components/ClayCard.vue'
+ * import ClayButton from '@/components/ClayButton.vue'
+ * import ClayInput from '@/components/ClayInput.vue'
+ */
+
+export { default as ClayCard } from './ClayCard.vue'
+export { default as ClayButton } from './ClayButton.vue'
+export { default as ClayInput } from './ClayInput.vue'
+
+/* ============================================
+ Claymorphism 设计系统说明
+
+ 🎨 核心特点:
+ 1. 双阴影效果(外部 + 内部)创造立体浮感
+ 2. 柔和的渐变背景
+ 3. 圆润的边角设计
+ 4. 有机感的按压动画
+
+ 📦 组件列表:
+ - ClayCard: 粘土风格卡片
+ - ClayButton: 粘土风格按钮
+ - ClayInput: 粘土风格输入框
+
+ 🎯 使用示例:
+
+
+
+ 卡片内容
+
+
+
+
+
+
+
+
+ 🎨 样式变量(uni.scss):
+ - $clay-shadow-sm/md/lg/xl: 阴影层级
+ - $clay-bg-light: #FAFAFA
+ - $clay-bg-white: #FFFFFF
+ - $clay-border: rgba(255, 255, 255, 0.8)
+
+ ============================================ */
diff --git a/docs/CLAYMORPHISM.md b/docs/CLAYMORPHISM.md
new file mode 100644
index 0000000..a132fd8
--- /dev/null
+++ b/docs/CLAYMORPHISM.md
@@ -0,0 +1,260 @@
+# Claymorphism UI 优化文档
+
+## 🎨 设计系统概述
+
+### 什么是 Claymorphism(粘土拟态)?
+
+Claymorphism 是一种结合了 **Neumorphism(新拟态)** 和 **3D 粘土质感** 的设计风格,具有以下特点:
+
+- ✨ **双阴影效果**:外部阴影 + 内部阴影创造立体浮感
+- 🎨 **柔和渐变**:使用 145deg 渐变创造有机感
+- 🔄 **圆润边角**:大圆角设计传递柔和友好感
+- 💫 **有机动画**:平滑的过渡和按压反馈
+- 🌈 **高对比度**:保持可访问性的同时提供视觉吸引力
+
+---
+
+## 📦 组件库
+
+### 核心组件
+
+| 组件 | 文件路径 | 功能 |
+|------|---------|------|
+| **ClayCard** | `/components/ClayCard.vue` | 粘土风格卡片 |
+| **ClayButton** | `/components/ClayButton.vue` | 粘土风格按钮 |
+| **ClayInput** | `/components/ClayInput.vue` | 粘土风格输入框 |
+
+### 使用示例
+
+```vue
+
+
+
+
+ 这是一张粘土卡片
+
+
+
+
+
+
+
+
+
+
+
+```
+
+---
+
+## 🎯 组件 Props
+
+### ClayCard
+
+| 属性 | 类型 | 默认值 | 说明 |
+|------|------|--------|------|
+| `size` | String | `'md'` | 尺寸:`sm`, `md`, `lg` |
+| `variant` | String | `'default'` | 变体:`default`, `primary`, `gold` |
+| `inset` | Boolean | `false` | 是否凹陷效果 |
+| `customClass` | String | `''` | 自定义类名 |
+| `customStyle` | Object | `{}` | 自定义样式 |
+
+### ClayButton
+
+| 属性 | 类型 | 默认值 | 说明 |
+|------|------|--------|------|
+| `text` | String | `'按钮'` | 按钮文字 |
+| `size` | String | `'md'` | 尺寸:`sm`, `md`, `lg` |
+| `variant` | String | `'primary'` | 变体:`primary`, `secondary`, `success`, `warning`, `error` |
+| `outline` | Boolean | `false` | 是否轮廓样式 |
+| `block` | Boolean | `false` | 是否块级按钮 |
+| `disabled` | Boolean | `false` | 是否禁用 |
+| `loading` | Boolean | `false` | 是否加载中 |
+| `icon` | String | `''` | 图标(emoji) |
+| `customStyle` | Object | `{}` | 自定义样式 |
+
+### ClayInput
+
+| 属性 | 类型 | 默认值 | 说明 |
+|------|------|--------|------|
+| `modelValue` | String/Number | `''` | v-model 绑定值 |
+| `type` | String | `'text'` | 输入框类型 |
+| `placeholder` | String | `'请输入'` | 占位符 |
+| `size` | String | `'md'` | 尺寸:`sm`, `md`, `lg` |
+| `disabled` | Boolean | `false` | 是否禁用 |
+| `error` | Boolean | `false` | 是否错误状态 |
+| `errorText` | String | `''` | 错误提示 |
+| `clearable` | Boolean | `false` | 是否可清空 |
+| `prefixIcon` | String | `''` | 前缀图标(emoji) |
+| `suffixIcon` | String | `''` | 后缀图标(emoji) |
+
+---
+
+## 🎨 样式变量
+
+在 `uni.scss` 中定义的核心变量:
+
+```scss
+/* Claymorphism 阴影层级 */
+$clay-shadow-sm: (...)
+$clay-shadow-md: (...)
+$clay-shadow-lg: (...)
+$clay-shadow-xl: (...)
+
+/* 颜色变量 */
+$clay-bg-light: #FAFAFA;
+$clay-bg-white: #FFFFFF;
+$clay-bg-soft: rgba(255, 255, 255, 0.85);
+$clay-border: rgba(255, 255, 255, 0.8);
+```
+
+---
+
+## 🔧 已优化的页面
+
+### ✅ 首页 (`pages/index/index.vue`)
+- Banner 轮播卡片
+- 通知栏
+- 玩法分类卡片
+- 活动列表项
+
+### ✅ 底部导航栏 (`components/app-tab-bar.vue`)
+- 导航栏背景
+- 图标容器(圆形徽章)
+- 选中状态动画
+
+### ✅ 个人中心 (`pages/mine/index.vue`)
+- 用户信息卡片
+- 头像凹陷效果
+- 统计数据卡片
+- 功能图标容器
+
+---
+
+## 🚀 快速开始
+
+### 1. 配置 easycom(推荐)
+
+在 `pages.json` 中添加:
+
+```json
+{
+ "easycom": {
+ "autoscan": true,
+ "custom": {
+ "^Clay(A.*)": "@/components/Clay$1.vue"
+ }
+ }
+}
+```
+
+### 2. 直接使用组件
+
+```vue
+
+ 内容
+
+
+
+```
+
+### 3. 使用全局样式类
+
+```vue
+
+
+ 内容
+
+
+ 按钮
+
+
+ 凹陷卡片
+
+```
+
+---
+
+## 🎨 设计原则
+
+### ✅ 推荐做法
+
+1. **保持一致性**:在整个应用中统一使用 Claymorphism 组件
+2. **适度使用**:不要过度使用,保持界面呼吸感
+3. **注意对比度**:确保文字与背景有足够的对比度
+4. **动画平滑**:使用 `cubic-bezier(0.4, 0, 0.2, 1)` 缓动函数
+5. **圆角统一**:卡片 24-32rpx,按钮 50-60rpx(圆角)
+
+### ❌ 避免做法
+
+1. **不要混合多种拟态风格**
+2. **不要使用过多的彩色渐变**
+3. **不要忽略深色模式适配**
+4. **不要在小元素上使用粘土效果**
+
+---
+
+## 📱 兼容性
+
+| 平台 | 支持情况 |
+|------|----------|
+| 微信小程序 | ✅ 完全支持 |
+| 抖音小程序 | ✅ 完全支持 |
+| H5 | ✅ 完全支持 |
+| App | ✅ 完全支持 |
+
+---
+
+## 🔮 后续计划
+
+- [ ] 添加更多组件:ClaySwitch、ClaySlider、ClayModal
+- [ ] 深色模式适配
+- [ ] 动画效果增强
+- [ ] 性能优化
+
+---
+
+## 📝 更新日志
+
+### v1.0.0 (2025-02-05)
+- ✅ 初始化 Claymorphism 设计系统
+- ✅ 创建核心组件:ClayCard、ClayButton、ClayInput
+- ✅ 优化首页、个人中心、底部导航栏
+- ✅ 添加全局样式变量和 Mixins
+
+---
+
+**设计团队**: Z Code AI Studio
+**最后更新**: 2025-02-05
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 900189b..3d5cfa8 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -448,7 +448,7 @@ export default {
z-index: 1;
}
-/* Banner Container (Modern Floating) */
+/* Banner Container - Claymorphism Style */
.banner-container {
padding: $spacing-sm $spacing-lg $spacing-xl;
position: relative;
@@ -462,17 +462,27 @@ export default {
.banner-card {
height: 100%;
margin: 0 4rpx;
- border-radius: 32rpx;
+ border-radius: 40rpx;
overflow: hidden;
position: relative;
transform: scale(0.96);
transition: all 0.5s $ease-out;
- box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.08);
+
+ /* Claymorphism 双阴影效果 */
+ box-shadow:
+ 12rpx 12rpx 24rpx rgba(0, 0, 0, 0.08),
+ -12rpx -12rpx 24rpx rgba(255, 255, 255, 0.7),
+ inset 4rpx 4rpx 8rpx rgba(255, 255, 255, 0.5),
+ inset -4rpx -4rpx 8rpx rgba(0, 0, 0, 0.05);
}
.banner-card.active {
transform: scale(1);
- box-shadow: $shadow-float;
+ box-shadow:
+ 16rpx 16rpx 32rpx rgba(255, 107, 0, 0.12),
+ -16rpx -16rpx 32rpx rgba(255, 255, 255, 0.6),
+ inset 6rpx 6rpx 12rpx rgba(255, 255, 255, 0.4),
+ inset -6rpx -6rpx 12rpx rgba(0, 0, 0, 0.06);
}
.banner-image {
@@ -541,17 +551,23 @@ export default {
background: $brand-primary;
}
-/* Notice Bar V2 (Minimalist) */
+/* Notice Bar - Claymorphism Style */
.notice-bar-v2 {
margin: 0 $spacing-lg $spacing-xl;
- background: rgba(255, 255, 255, 0.7);
- backdrop-filter: blur(10rpx);
- border-radius: 32rpx;
+ background: linear-gradient(145deg, #ffffff, #f5f5f5);
+ border-radius: 40rpx;
padding: 24rpx 32rpx;
display: flex;
align-items: center;
gap: 20rpx;
- box-shadow: $shadow-sm;
+
+ /* Claymorphism 双阴影 */
+ box-shadow:
+ 8rpx 8rpx 16rpx rgba(0, 0, 0, 0.06),
+ -8rpx -8rpx 16rpx rgba(255, 255, 255, 0.8),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.9),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.03);
+
border: 1px solid rgba(255, 255, 255, 0.6);
}
@@ -616,19 +632,31 @@ export default {
height: 190rpx;
}
+/* 玩法卡片 - Claymorphism Style */
.game-card-large {
flex: 1;
- border-radius: $radius-lg;
+ border-radius: $radius-xl;
position: relative;
overflow: hidden;
padding: 22rpx;
- box-shadow: $shadow-card;
transition: transform 0.2s;
+
+ /* Claymorphism 阴影 */
+ box-shadow:
+ 12rpx 12rpx 24rpx rgba(0, 0, 0, 0.1),
+ -12rpx -12rpx 24rpx rgba(255, 255, 255, 0.6),
+ inset 4rpx 4rpx 8rpx rgba(255, 255, 255, 0.3),
+ inset -4rpx -4rpx 8rpx rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.game-card-large:active {
- transform: scale(0.98);
+ transform: scale(0.96);
+ box-shadow:
+ 6rpx 6rpx 12rpx rgba(0, 0, 0, 0.12),
+ -6rpx -6rpx 12rpx rgba(255, 255, 255, 0.4),
+ inset 6rpx 6rpx 12rpx rgba(0, 0, 0, 0.15),
+ inset -6rpx -6rpx 12rpx rgba(255, 255, 255, 0.2);
}
/* 下排 */
@@ -640,20 +668,31 @@ export default {
.game-card-small {
flex: 1;
- border-radius: $radius-md;
+ border-radius: $radius-lg;
position: relative;
overflow: hidden;
padding: 16rpx;
display: flex;
flex-direction: column;
justify-content: center;
- box-shadow: $shadow-sm;
- background: white;
transition: all 0.2s;
+
+ /* Claymorphism 阴影 */
+ box-shadow:
+ 8rpx 8rpx 16rpx rgba(0, 0, 0, 0.08),
+ -8rpx -8rpx 16rpx rgba(255, 255, 255, 0.7),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.5),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.05);
+ background: linear-gradient(145deg, #ffffff, #f8f8f8);
+ border: 1px solid rgba(255, 255, 255, 0.6);
}
.game-card-small:active {
- transform: scale(0.96);
- box-shadow: none;
+ transform: scale(0.94);
+ box-shadow:
+ 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1),
+ -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.5),
+ inset 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.08),
+ inset -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.3);
}
/* 内容样式 - 大卡片 */
@@ -748,7 +787,7 @@ export default {
.card-more .card-title-small { color: $text-sub; }
-/* 推荐活动列表 */
+/* 推荐活动列表 - Claymorphism Style */
.activity-section {
padding: 0 $spacing-lg;
animation: fadeInUp 0.6s ease-out 0.3s backwards;
@@ -763,20 +802,29 @@ export default {
}
.activity-item {
- background: rgba(255, 255, 255, 0.7);
- backdrop-filter: blur(10rpx);
+ background: linear-gradient(145deg, #ffffff, #f8f8f8);
border-radius: $radius-xl;
overflow: hidden;
- box-shadow: $shadow-sm;
display: flex;
flex-direction: column;
transition: all 0.3s ease;
+
+ /* Claymorphism 阴影 */
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(0, 0, 0, 0.06),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.8),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.03);
border: 1px solid rgba(255, 255, 255, 0.6);
}
.activity-item:active {
- transform: translateY(4rpx);
- box-shadow: none;
+ transform: translateY(4rpx) scale(0.98);
+ box-shadow:
+ 5rpx 5rpx 10rpx rgba(0, 0, 0, 0.08),
+ -5rpx -5rpx 10rpx rgba(255, 255, 255, 0.5),
+ inset 5rpx 5rpx 10rpx rgba(0, 0, 0, 0.05),
+ inset -5rpx -5rpx 10rpx rgba(255, 255, 255, 0.3);
}
.activity-thumb-box {
diff --git a/pages/mine/index.vue b/pages/mine/index.vue
index 366d86a..bc02a36 100644
--- a/pages/mine/index.vue
+++ b/pages/mine/index.vue
@@ -1533,12 +1533,16 @@ export default {
50% { transform: translate(30rpx, 50rpx); }
}
-/* 通用毛玻璃卡片 */
+/* 通用毛玻璃卡片 - Claymorphism */
.glass-card {
- background: $bg-glass;
+ background: linear-gradient(145deg, #ffffff, #f8f8f8);
backdrop-filter: blur(20rpx);
border: 1px solid rgba(255, 255, 255, 0.6);
- box-shadow: $shadow-card;
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(0, 0, 0, 0.06),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.8),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.03);
border-radius: $radius-lg;
position: relative;
z-index: 1;
@@ -1553,9 +1557,14 @@ export default {
.user-info-card {
padding: $spacing-xl;
- background: linear-gradient(135deg, rgba(255,255,255,0.95), rgba(255,255,255,0.8));
- box-shadow: $shadow-float;
- border: 1px solid rgba(255,255,255,0.8);
+ background: linear-gradient(145deg, #ffffff, #f8f8f8);
+ box-shadow:
+ 12rpx 12rpx 24rpx rgba(0, 0, 0, 0.06),
+ -12rpx -12rpx 24rpx rgba(255, 255, 255, 0.7),
+ inset 4rpx 4rpx 8rpx rgba(255, 255, 255, 0.85),
+ inset -4rpx -4rpx 8rpx rgba(0, 0, 0, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.6);
+ border-radius: $radius-xl;
}
.user-main {
@@ -1569,7 +1578,11 @@ export default {
background: $bg-card;
border-radius: 50%;
border: 4rpx solid $bg-card;
- box-shadow: $shadow-sm;
+
+ /* Claymorphism 凹陷效果 */
+ box-shadow:
+ inset 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1),
+ inset -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.9);
margin-right: 24rpx;
}
@@ -1588,13 +1601,19 @@ export default {
right: 0;
width: 40rpx;
height: 40rpx;
- background: linear-gradient(135deg, $brand-primary, $brand-secondary);
+ background: linear-gradient(145deg, #FF9500, #FF6B00);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
border: 3rpx solid $bg-card;
- box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);
+
+ /* Claymorphism 凸起效果 */
+ box-shadow:
+ 4rpx 4rpx 8rpx rgba(255, 107, 0, 0.2),
+ -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.7),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.4),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.1);
.edit-icon {
font-size: 20rpx;
@@ -1750,10 +1769,18 @@ export default {
transform: rotate(-15deg);
}
-/* 常用功能 & 订单 */
+/* 常用功能 & 订单 - Claymorphism */
.section-card {
margin: 0 $spacing-lg $spacing-lg;
padding: 30rpx;
+ background: linear-gradient(145deg, #ffffff, #f8f8f8);
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(0, 0, 0, 0.05),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.8),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.6);
+ border-radius: $radius-lg;
}
.section-header {
display: flex; justify-content: space-between; align-items: center;
@@ -1774,14 +1801,22 @@ export default {
}
.icon-wrapper, .menu-icon-box {
width: 80rpx; height: 80rpx;
- background: $bg-secondary;
+ background: linear-gradient(145deg, #f8f8f8, #e8e8e8);
border-radius: 24rpx;
display: flex; align-items: center; justify-content: center;
margin-bottom: 12rpx;
transition: all 0.3s;
+
+ /* Claymorphism 凹陷效果 */
+ box-shadow:
+ inset 3rpx 3rpx 6rpx rgba(0, 0, 0, 0.06),
+ inset -3rpx -3rpx 6rpx rgba(255, 255, 255, 0.9);
}
.grid-item:active .icon-wrapper, .menu-item:active .menu-icon-box {
- background: $uni-bg-color-hover;
+ background: linear-gradient(145deg, #e8e8e8, #d8d8d8);
+ box-shadow:
+ inset 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1),
+ inset -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.7);
}
.grid-icon-img, .menu-icon-img { width: 44rpx; height: 44rpx; }
.grid-label, .menu-label { font-size: $font-sm; color: $text-main; }
diff --git a/uni.scss b/uni.scss
index 6a627fc..f403db2 100644
--- a/uni.scss
+++ b/uni.scss
@@ -185,6 +185,44 @@ $uni-font-size-paragraph: 15px;
-webkit-box-orient: vertical;
}
+/* ============================================
+ 💎 Claymorphism 设计系统 (2025)
+ 粘土拟态风格 - 柔和、圆润、立体浮感
+ ============================================ */
+
+/* 🎨 Claymorphism 核心阴影 */
+$clay-shadow-sm: (
+ 6rpx 6rpx 12rpx rgba(0, 0, 0, 0.04),
+ -6rpx -6rpx 12rpx rgba(255, 255, 255, 0.8),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.9),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.03)
+);
+$clay-shadow-md: (
+ 12rpx 12rpx 24rpx rgba(0, 0, 0, 0.06),
+ -12rpx -12rpx 24rpx rgba(255, 255, 255, 0.7),
+ inset 4rpx 4rpx 8rpx rgba(255, 255, 255, 0.85),
+ inset -4rpx -4rpx 8rpx rgba(0, 0, 0, 0.04)
+);
+$clay-shadow-lg: (
+ 20rpx 20rpx 40rpx rgba(0, 0, 0, 0.08),
+ -20rpx -20rpx 40rpx rgba(255, 255, 255, 0.6),
+ inset 6rpx 6rpx 12rpx rgba(255, 255, 255, 0.8),
+ inset -6rpx -6rpx 12rpx rgba(0, 0, 0, 0.05)
+);
+$clay-shadow-xl: (
+ 28rpx 28rpx 56rpx rgba(0, 0, 0, 0.1),
+ -28rpx -28rpx 56rpx rgba(255, 255, 255, 0.5),
+ inset 8rpx 8rpx 16rpx rgba(255, 255, 255, 0.75),
+ inset -8rpx -8rpx 16rpx rgba(0, 0, 0, 0.06)
+);
+
+/* Claymorphism 颜色变量 */
+$clay-bg-light: #FAFAFA;
+$clay-bg-white: #FFFFFF;
+$clay-bg-soft: rgba(255, 255, 255, 0.85);
+$clay-border: rgba(255, 255, 255, 0.8);
+$clay-border-dark: rgba(0, 0, 0, 0.04);
+
/* ============================================
💎 核心公共 UI 类 (Premium UI 6.0)
============================================ */
@@ -240,6 +278,141 @@ $uni-font-size-paragraph: 15px;
z-index: 1;
}
+/* ============================================
+ 🟤 Claymorphism 卡片组件
+ ============================================ */
+
+/* 基础粘土卡片 */
+.clay-card {
+ background: linear-gradient(145deg, #ffffff, #f0f0f0);
+ border-radius: $radius-lg;
+ position: relative;
+ transition: all $transition-normal $ease-out;
+
+ /* 外部双阴影 - 创造凸起效果 */
+ box-shadow:
+ 8rpx 8rpx 16rpx rgba(0, 0, 0, 0.06),
+ -8rpx -8rpx 16rpx rgba(255, 255, 255, 0.8),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.9),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.03);
+
+ &.clay-card-sm {
+ border-radius: $radius-md;
+ box-shadow:
+ 6rpx 6rpx 12rpx rgba(0, 0, 0, 0.04),
+ -6rpx -6rpx 12rpx rgba(255, 255, 255, 0.8),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.9),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.03);
+ }
+
+ &.clay-card-lg {
+ border-radius: $radius-xl;
+ box-shadow:
+ 12rpx 12rpx 24rpx rgba(0, 0, 0, 0.08),
+ -12rpx -12rpx 24rpx rgba(255, 255, 255, 0.7),
+ inset 4rpx 4rpx 8rpx rgba(255, 255, 255, 0.85),
+ inset -4rpx -4rpx 8rpx rgba(0, 0, 0, 0.04);
+ }
+
+ &:active {
+ transform: scale(0.98);
+ box-shadow:
+ 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.06),
+ -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.6),
+ inset 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.05),
+ inset -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.4);
+ }
+}
+
+/* 彩色粘土卡片 */
+.clay-card-primary {
+ background: linear-gradient(145deg, $brand-primary-light, $brand-primary);
+ color: #fff;
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(255, 107, 0, 0.2),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.4),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.1);
+
+ &.clay-card-gold {
+ background: linear-gradient(145deg, #FFD60A, #FF9F0A);
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(255, 159, 10, 0.2),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.4),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.1);
+ }
+}
+
+/* 凹陷粘土卡片 (Inset) */
+.clay-card-inset {
+ background: linear-gradient(145deg, #e8e8e8, #f8f8f8);
+ box-shadow:
+ inset 6rpx 6rpx 12rpx rgba(0, 0, 0, 0.08),
+ inset -6rpx -6rpx 12rpx rgba(255, 255, 255, 0.9);
+}
+
+/* ============================================
+ 🔘 Claymorphism 按钮组件
+ ============================================ */
+
+.clay-btn {
+ border-radius: $radius-round;
+ font-weight: 700;
+ position: relative;
+ transition: all $transition-normal $ease-out;
+ border: none;
+
+ /* 外部双阴影 - 创造凸起感 */
+ box-shadow:
+ 8rpx 8rpx 16rpx rgba(0, 0, 0, 0.08),
+ -8rpx -8rpx 16rpx rgba(255, 255, 255, 0.8),
+ inset 2rpx 2rpx 4rpx rgba(255, 255, 255, 0.5),
+ inset -2rpx -2rpx 4rpx rgba(0, 0, 0, 0.05);
+
+ &.clay-btn-primary {
+ background: linear-gradient(145deg, $brand-primary-light, $brand-primary);
+ color: #fff;
+ box-shadow:
+ 10rpx 10rpx 20rpx rgba(255, 107, 0, 0.15),
+ -10rpx -10rpx 20rpx rgba(255, 255, 255, 0.7),
+ inset 3rpx 3rpx 6rpx rgba(255, 255, 255, 0.4),
+ inset -3rpx -3rpx 6rpx rgba(0, 0, 0, 0.1);
+ }
+
+ &.clay-btn-secondary {
+ background: linear-gradient(145deg, #ffffff, #f0f0f0);
+ color: $text-main;
+ }
+
+ &.clay-btn-sm {
+ padding: 12rpx 32rpx;
+ font-size: $font-sm;
+ border-radius: 40rpx;
+ }
+
+ &.clay-btn-md {
+ padding: 20rpx 48rpx;
+ font-size: $font-md;
+ border-radius: 50rpx;
+ }
+
+ &.clay-btn-lg {
+ padding: 28rpx 64rpx;
+ font-size: $font-lg;
+ border-radius: 60rpx;
+ }
+
+ &:active {
+ transform: scale(0.96);
+ box-shadow:
+ 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1),
+ -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.5),
+ inset 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.08),
+ inset -4rpx -4rpx 8rpx rgba(255, 255, 255, 0.3);
+ }
+}
+
/* 3. 通用功能按钮 */
.btn-primary {
background: $gradient-brand;