This commit is contained in:
sion
2026-04-07 01:05:05 +08:00
parent edad10ff06
commit 5ca1274607
83 changed files with 1561 additions and 1241 deletions

View File

@@ -4,13 +4,13 @@ import 'package:flutter_animate/flutter_animate.dart';
import '../../core/theme/app_spacing.dart';
import '../../core/theme/app_theme_extension.dart';
/// 资产卡片件 - 用于显示资产总览
/// 資產卡片件 - 用於顯示資產總覽
///
/// 设计规则 ("The Kinetic Vault"):
/// - 渐变背景: Neon Blue → Electric Purple
/// - 角: xl (16px)
/// - 无边框,使用渐变层
/// - 微妙影: 10% black, blur 10px
/// 設計規則 ("The Kinetic Vault"):
/// - 漸變背景: Neon Blue → Electric Purple
/// - 角: xl (16px)
/// - 無邊框,使用漸變層
/// - 微妙影: 10% black, blur 10px
class AssetCard extends StatelessWidget {
final String title;
final String balance;
@@ -23,7 +23,7 @@ class AssetCard extends StatelessWidget {
const AssetCard({
super.key,
this.title = '总资产',
this.title = '總資產',
required this.balance,
this.subtitle,
this.profit,
@@ -40,7 +40,7 @@ class AssetCard extends StatelessWidget {
final appColors = context.appColors;
final cardGradient = gradient ?? appColors.assetGradient;
// 主感知色 - 在渐变背景上使用 onPrimary
// 主感知色 - 在漸變背景上使用 onPrimary
final primaryTextColor = colorScheme.onPrimary;
final secondaryTextColor = colorScheme.onPrimary.withValues(alpha: 0.7);
@@ -63,7 +63,7 @@ class AssetCard extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 标题
// 標題
Row(
children: [
Text(
@@ -80,7 +80,7 @@ class AssetCard extends StatelessWidget {
],
),
const SizedBox(height: AppSpacing.sm),
// 余额 - 大标题
// 餘額 - 大標題
Text(
balance,
style: theme.textTheme.h1.copyWith(
@@ -89,7 +89,7 @@ class AssetCard extends StatelessWidget {
fontSize: 20,
),
),
// 盈信息
// 盈信息
if (profit != null) ...[
const SizedBox(height: AppSpacing.md),
Row(
@@ -101,13 +101,13 @@ class AssetCard extends StatelessWidget {
),
const SizedBox(width: 6),
Text(
': $profit',
': $profit',
style: theme.textTheme.small.copyWith(color: secondaryTextColor),
),
],
),
],
// 子
// 子
if (items != null && items!.isNotEmpty) ...[
const SizedBox(height: AppSpacing.lg),
Row(
@@ -143,7 +143,7 @@ class AssetCard extends StatelessWidget {
}
}
/// 资产子项
/// 資產子項
class AssetItem {
final String label;
final String value;
@@ -154,12 +154,12 @@ class AssetItem {
});
}
/// 简洁资产卡片 - 用列表中
/// 簡潔資產卡片 - 用列表中
///
/// 设计规则:
/// - 使用 surface 次而非
/// - 角: xl (16px)
/// - 涨跌标签: 15% 透明度背景
/// 設計規則:
/// - 使用 surface 次而非
/// - 角: xl (16px)
/// - 漲跌標籤: 15% 透明度背景
class AssetCardCompact extends StatelessWidget {
final String title;
final String balance;

View File

@@ -3,12 +3,12 @@ import 'package:shadcn_ui/shadcn_ui.dart';
import '../../core/theme/app_spacing.dart';
import '../../core/theme/app_theme_extension.dart';
/// 币种卡片件 - 用于显示币种信息
/// 幣種卡片件 - 用於顯示幣種信息
///
/// 设计规则:
/// - 使用 surface 次而非
/// - 角: xl (16px) 卡片, sm (4px) 涨跌标签
/// - 涨跌标签: 15% 透明度背景
/// 設計規則:
/// - 使用 surface 次而非
/// - 角: xl (16px) 卡片, sm (4px) 漲跌標籤
/// - 漲跌標籤: 15% 透明度背景
class CoinCard extends StatelessWidget {
final String code;
final String name;
@@ -39,7 +39,7 @@ class CoinCard extends StatelessWidget {
onTap: onTap,
child: Row(
children: [
// 图标 -
// 圖標 -
Container(
width: 44,
height: 44,
@@ -59,7 +59,7 @@ class CoinCard extends StatelessWidget {
),
),
const SizedBox(width: AppSpacing.sm),
// 名
// 名
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -77,7 +77,7 @@ class CoinCard extends StatelessWidget {
],
),
),
// 跌幅 - Dynamic Chip
// 跌幅 - Dynamic Chip
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
decoration: BoxDecoration(

View File

@@ -1,4 +1,4 @@
/// 自定义组件导
/// 自定義組件導
library components;
export 'coin_card.dart';

View File

@@ -2,43 +2,43 @@ import 'package:flutter/material.dart';
import '../../core/theme/app_spacing.dart';
import '../../core/theme/app_theme_extension.dart';
/// GlassPanel - 心背景面板
/// GlassPanel - 心背景面板
///
/// Material Design 3 格的心背景容器
/// 用卡片、窗、底部抽等需要清晰背景的容器
/// Material Design 3 格的心背景容器
/// 用卡片、窗、底部抽等需要清晰背景的容器
///
/// 示例:
/// ```dart
/// GlassPanel(
/// child: Text('容'),
/// child: Text('容'),
/// )
/// ```
class GlassPanel extends StatelessWidget {
/// 子
/// 子
final Widget child;
/// 背景色,默使用 surfaceContainer
/// 背景色,默使用 surfaceContainer
final Color? backgroundColor;
/// 框色
/// 框色
final Color? borderColor;
/// 角,默特大
/// 角,默特大
final BorderRadius? borderRadius;
/// 内边
/// 內邊
final EdgeInsetsGeometry? padding;
/// 外
/// 外
final EdgeInsetsGeometry? margin;
///
///
final double? width;
/// 高度
final double? height;
/// 是否显示边
/// 是否顯示邊
final bool showBorder;
const GlassPanel({
@@ -88,33 +88,33 @@ class GlassPanel extends StatelessWidget {
}
}
/// GlassCard - 带实心背景的卡片
/// GlassCard - 帶實心背景的卡片
///
/// 用列表、信息展示等
/// 预设了常用配置,化使用
/// 用列表、信息展示等
/// 預設了常用配置,化使用
class GlassCard extends StatelessWidget {
/// 子
/// 子
final Widget child;
/// 点击回调
/// 點擊回調
final VoidCallback? onTap;
/// 按回
/// 按回調
final VoidCallback? onLongPress;
/// 内边
/// 內邊
final EdgeInsetsGeometry? padding;
/// 外
/// 外
final EdgeInsetsGeometry? margin;
///
///
final BorderRadius? borderRadius;
/// 是否示霓虹光效
/// 是否示霓虹光效
final bool showNeonGlow;
/// 霓虹光效
/// 霓虹光效
final Color? neonGlowColor;
const GlassCard({
@@ -170,20 +170,20 @@ class GlassCard extends StatelessWidget {
}
}
/// GlassBottomSheet - 心背景底部抽
/// GlassBottomSheet - 心背景底部抽
///
/// 用于弹出的底部面板
/// 用於彈出的底部面板
class GlassBottomSheet extends StatelessWidget {
/// 子
/// 子
final Widget child;
/// 标题
/// 標題
final String? title;
/// 是否显示关闭按钮
/// 是否顯示關閉按鈕
final bool showCloseButton;
/// 内边
/// 內邊
final EdgeInsetsGeometry? padding;
const GlassBottomSheet({
@@ -209,7 +209,7 @@ class GlassBottomSheet extends StatelessWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 部拖动条
// 部拖動條
Container(
margin: const EdgeInsets.only(top: 12, bottom: 8),
width: 40,
@@ -219,7 +219,7 @@ class GlassBottomSheet extends StatelessWidget {
borderRadius: BorderRadius.circular(2),
),
),
// 标题栏
// 標題欄
if (title != null || showCloseButton)
Padding(
padding: EdgeInsets.fromLTRB(
@@ -261,7 +261,7 @@ class GlassBottomSheet extends StatelessWidget {
],
),
),
//
//
Padding(
padding: padding ??
EdgeInsets.fromLTRB(
@@ -277,7 +277,7 @@ class GlassBottomSheet extends StatelessWidget {
);
}
/// 示底部抽
/// 示底部抽
static Future<T?> show<T>({
required BuildContext context,
required Widget Function(BuildContext) builder,

View File

@@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
import '../../core/theme/app_spacing.dart';
import '../../core/theme/app_theme_extension.dart';
/// 渐变按钮组件 - 支持 CTA 渐变效果
/// 漸變按鈕組件 - 支持 CTA 漸變效果
///
/// 设计规则
/// - 渐变方向: 135度 (primary → primary_container)
/// - 角: xxl (24px / 1.5rem)
/// - 无边
/// 設計規則
/// - 漸變方向: 135度 (primary → primary_container)
/// - 角: xxl (24px / 1.5rem)
/// - 無邊
class GradientButton extends StatelessWidget {
final String text;
final VoidCallback? onPressed;
@@ -28,7 +28,7 @@ class GradientButton extends StatelessWidget {
this.height = 48,
});
/// CTA 按 - 使用主题渐变
/// CTA 按 - 使用主題漸變
factory GradientButton.cta({
Key? key,
required String text,
@@ -47,7 +47,7 @@ class GradientButton extends StatelessWidget {
);
}
/// 入按 - 翡翠绿渐变
/// 入按 - 翡翠綠漸變
factory GradientButton.buy({
Key? key,
required String text,
@@ -67,7 +67,7 @@ class GradientButton extends StatelessWidget {
);
}
/// 出按 - 红色渐变
/// 出按 - 紅色漸變
factory GradientButton.sell({
Key? key,
required String text,
@@ -93,7 +93,7 @@ class GradientButton extends StatelessWidget {
final colorScheme = context.colors;
final buttonGradient = gradient ?? appColors.ctaGradient;
// 主感知色 - 在渐变背景上使用 onPrimary
// 主感知色 - 在漸變背景上使用 onPrimary
final textColor = colorScheme.onPrimary;
return Container(
@@ -145,11 +145,11 @@ class GradientButton extends StatelessWidget {
}
}
/// Ghost 按 - 次要操作
/// Ghost 按 - 次要操作
///
/// 设计规则
/// 設計規則
/// - Ghost Border: 15% opacity outline-variant
/// - 角: xxl (24px)
/// - 角: xxl (24px)
/// - 主色文字
class GhostButton extends StatelessWidget {
final String text;

View File

@@ -3,30 +3,30 @@ import '../../core/theme/app_color_scheme.dart';
import '../../core/theme/app_spacing.dart';
import '../../core/theme/app_theme_extension.dart';
/// NeonGlow - 霓虹光效
/// NeonGlow - 霓虹光效
///
/// Material Design 3 格的霓虹光效
/// 用于按钮、卡片、图标等需要突出示的元素
/// Material Design 3 格的霓虹光效
/// 用於按鈕、卡片、圖標等需要突出示的元素
///
/// 光效型:
/// 光效型:
/// - Primary: 青色光效 (#72dcff)
/// - Secondary: 紫色光效 (#dd8bfb)
/// - Tertiary: 绿色光效 (#afffd1)
/// - Error: 色光效 (#ff716c)
/// - Tertiary: 色光效 (#afffd1)
/// - Error: 色光效 (#ff716c)
class NeonGlow extends StatelessWidget {
/// 子
/// 子
final Widget child;
/// 光效
/// 光效
final Color glowColor;
/// 模糊半,默 15.0
/// 模糊半,默 15.0
final double blurRadius;
/// 散半,默 0.0
/// 散半,默 0.0
final double spreadRadius;
///
///
final BorderRadius? borderRadius;
const NeonGlow({
@@ -70,7 +70,7 @@ class NeonGlow extends StatelessWidget {
);
}
/// Tertiary 霓虹光效 (绿色)
/// Tertiary 霓虹光效 (色)
factory NeonGlow.tertiary({
Key? key,
required Widget child,
@@ -86,7 +86,7 @@ class NeonGlow extends StatelessWidget {
);
}
/// Error 霓虹光效 (色)
/// Error 霓虹光效 (色)
factory NeonGlow.error({
Key? key,
required Widget child,
@@ -122,32 +122,32 @@ class NeonGlow extends StatelessWidget {
}
}
/// NeonButton - 霓虹光效的按
/// NeonButton - 霓虹光效的按
///
/// 预设了常用配置,化使用
/// 預設了常用配置,化使用
class NeonButton extends StatefulWidget {
/// 按文本
/// 按文本
final String text;
/// 点击回调
/// 點擊回調
final VoidCallback? onPressed;
/// 按钮类
/// 按鈕類
final NeonButtonType type;
/// 是否示光效
/// 是否示光效
final bool showGlow;
/// 图标
/// 圖標
final IconData? icon;
/// 是否加
/// 是否加
final bool isLoading;
/// 按钮宽
/// 按鈕寬
final double? width;
/// 按高度,默 48
/// 按高度,默 48
final double height;
const NeonButton({
@@ -258,7 +258,7 @@ class _NeonButtonState extends State<NeonButton>
}
LinearGradient? get _gradient {
// 【化】移除所有渐变效果,改为纯色背景,提升专业金融感
// 【化】移除所有漸變效果,改為純色背景,提升專業金融感
return null;
}
@@ -335,39 +335,39 @@ class _NeonButtonState extends State<NeonButton>
}
}
/// 按钮类
/// 按鈕類
enum NeonButtonType {
/// 主要按 (青色)
/// 主要按 (青色)
primary,
/// 次要按 (紫色)
/// 次要按 (紫色)
secondary,
/// 成功按 (绿色)
/// 成功按 (色)
tertiary,
/// 危险按钮 (色)
/// 危險按鈕 (色)
error,
/// 框按
/// 框按
outline,
}
/// NeonIcon - 霓虹光效的图标
/// NeonIcon - 霓虹光效的圖標
class NeonIcon extends StatelessWidget {
/// 图标
/// 圖標
final IconData icon;
/// 图标大小
/// 圖標大小
final double size;
/// 图标颜
/// 圖標顏
final Color color;
/// 光效色,默使用图标颜
/// 光效色,默使用圖標顏
final Color? glowColor;
/// 光效模糊半
/// 光效模糊半
final double glowBlur;
const NeonIcon({

View File

@@ -2,13 +2,13 @@ import 'package:flutter/material.dart';
import '../../core/theme/app_color_scheme.dart';
import '../../core/theme/app_spacing.dart';
/// 交易按钮组件 - 入/出按
/// 交易按鈕組件 - 入/出按
///
/// 设计规则
/// - 渐变按钮: 135度渐变
/// - 角: xxl (24px / 1.5rem)
/// - 入: 翡翠绿渐变
/// - 出: 红色渐变
/// 設計規則
/// - 漸變按鈕: 135度漸變
/// - 角: xxl (24px / 1.5rem)
/// - 入: 翡翠綠漸變
/// - 出: 紅色漸變
class TradeButton extends StatelessWidget {
final bool isBuy;
final String? coinCode;
@@ -25,7 +25,7 @@ class TradeButton extends StatelessWidget {
this.fullWidth = false,
});
/// 入按
/// 入按
const TradeButton.buy({
super.key,
this.coinCode,
@@ -34,7 +34,7 @@ class TradeButton extends StatelessWidget {
this.fullWidth = false,
}) : isBuy = true;
/// 出按
/// 出按
const TradeButton.sell({
super.key,
this.coinCode,
@@ -48,10 +48,10 @@ class TradeButton extends StatelessWidget {
final colorScheme = Theme.of(context).colorScheme;
final gradient = isBuy ? AppColorScheme.buyGradient : AppColorScheme.sellGradient;
final text = isBuy
? '${coinCode != null ? ' $coinCode' : ''}'
: '${coinCode != null ? ' $coinCode' : ''}';
? '${coinCode != null ? ' $coinCode' : ''}'
: '${coinCode != null ? ' $coinCode' : ''}';
// 主感知色 - 在渐变背景上使用 onPrimary
// 主感知色 - 在漸變背景上使用 onPrimary
final textColor = colorScheme.onPrimary;
return Container(
@@ -103,7 +103,7 @@ class TradeButton extends StatelessWidget {
}
}
/// 交易按钮组 - 同时显示买入和出按
/// 交易按鈕組 - 同時顯示買入和出按
class TradeButtonGroup extends StatelessWidget {
final String? coinCode;
final VoidCallback? onBuyPressed;