526e7f2f33
基于 design/flutter/ 起步包在 client/ 下建立 Flutter 工程:
- pubspec.yaml:flutter_svg / lucide_icons / google_fonts 依赖;
SVG 资产注册;字体由 google_fonts 运行时加载,无需本地 ttf
- lib/pangolin_theme.dart:完整设计令牌(色阶 / 间距 / 圆角 /
动效 / 文字阶),PangolinText 改用 GoogleFonts getter,
PangolinTheme.light / .dark 开箱即用
- lib/main.dart:runApp + 明暗主题 + 登录 → 引导 → 主框架 RootFlow
- lib/widgets/:全套组件雏形
pangolin_icons Lucide 图标映射
pangolin_button 胶囊按钮四态
country_code 国家码块 + 信号条
status_pill 色点胶囊
connect_button 核心连接键三态(off/connecting/on + 动画)
server_tile 服务器列表行
plan_card 套餐卡(专业版渐变高亮)
auth_screen 登录 / 注册(邮箱验证码 + 设密码)
onboarding_screen 首次引导 PageView(3 屏可滑动 + 进度点)
home_shell 底部 4 Tab(连接/节点/统计/账户 + 状态机)
account_screens 套餐选择 / 设备管理 / 兑换 / 联系我们
pangolin_logo PangolinMark / BrandLockup / AppIcon(SVG)
- assets/:logo-mark / logo-mark-white / logo-wordmark / app-icon(SVG)
- android/:Kotlin 主 Activity + Manifest + Gradle 配置
- ios/:Runner.xcodeproj + xcscheme + Podfile + AppDelegate + storyboard
运行方式(cd client/):
flutter pub get && flutter run
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
68 lines
3.1 KiB
Dart
68 lines
3.1 KiB
Dart
// pangolin_icons.dart — Lucide 图标映射表
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:lucide_icons/lucide_icons.dart';
|
|
|
|
class PangolinIcons {
|
|
PangolinIcons._();
|
|
|
|
// ── 连接 / 状态 ──
|
|
static const power = LucideIcons.power;
|
|
static const shieldCheck = LucideIcons.shieldCheck;
|
|
static const shield = LucideIcons.shield;
|
|
static const loader = LucideIcons.loader;
|
|
static const zap = LucideIcons.zap;
|
|
static const globe = LucideIcons.globe;
|
|
|
|
// ── 导航 / 操作 ──
|
|
static const settings = LucideIcons.settings;
|
|
static const user = LucideIcons.user;
|
|
static const search = LucideIcons.search;
|
|
static const check = LucideIcons.check;
|
|
static const checkCircle = LucideIcons.checkCircle;
|
|
static const x = LucideIcons.x;
|
|
static const chevronRight = LucideIcons.chevronRight;
|
|
static const chevronDown = LucideIcons.chevronDown;
|
|
static const arrowLeft = LucideIcons.arrowLeft;
|
|
static const arrowUp = LucideIcons.arrowUp;
|
|
static const arrowDown = LucideIcons.arrowDown;
|
|
static const refreshCw = LucideIcons.refreshCw;
|
|
static const compass = LucideIcons.compass;
|
|
static const barChart = LucideIcons.barChart;
|
|
static const mapPin = LucideIcons.mapPin;
|
|
|
|
// ── 主题 ──
|
|
static const moon = LucideIcons.moon;
|
|
static const sun = LucideIcons.sun;
|
|
|
|
// ── 账户 / 套餐 / 兑换 ──
|
|
static const crown = LucideIcons.crown;
|
|
static const ticket = LucideIcons.ticket;
|
|
static const creditCard = LucideIcons.creditCard;
|
|
static const shoppingBag = LucideIcons.shoppingBag;
|
|
static const mail = LucideIcons.mail;
|
|
static const lock = LucideIcons.lock;
|
|
static const logOut = LucideIcons.logOut;
|
|
static const send = LucideIcons.send;
|
|
static const messageCircle= LucideIcons.messageCircle;
|
|
static const externalLink = LucideIcons.externalLink;
|
|
|
|
// ── 设备 ──
|
|
static const laptop = LucideIcons.laptop;
|
|
static const smartphone = LucideIcons.smartphone;
|
|
static const monitorSmartphone = LucideIcons.smartphone; // 回退
|
|
|
|
static IconData? byName(String name) => _byName[name];
|
|
|
|
static const Map<String, IconData> _byName = {
|
|
'power': power, 'shield-check': shieldCheck, 'shield': shield, 'loader-circle': loader,
|
|
'zap': zap, 'globe': globe, 'settings': settings, 'user': user, 'search': search,
|
|
'check': check, 'check-circle': checkCircle, 'x': x, 'chevron-right': chevronRight,
|
|
'chevron-down': chevronDown, 'arrow-left': arrowLeft, 'arrow-up': arrowUp, 'arrow-down': arrowDown,
|
|
'refresh-cw': refreshCw, 'compass': compass, 'chart-no-axes-column': barChart, 'chart': barChart,
|
|
'map-pin': mapPin, 'moon': moon, 'sun': sun, 'crown': crown, 'ticket': ticket,
|
|
'credit-card': creditCard, 'shopping-bag': shoppingBag, 'mail': mail, 'lock': lock,
|
|
'log-out': logOut, 'send': send, 'message-circle': messageCircle, 'external-link': externalLink,
|
|
'laptop': laptop, 'smartphone': smartphone, 'monitor-smartphone': monitorSmartphone,
|
|
};
|
|
}
|