# 穿山甲 VPN — Flutter 设计令牌 生产前端使用 **Flutter**。本目录提供与 `../colors_and_type.css` **一一对应**的 Dart 令牌,Flutter 可直接消费。`ui_kits/` 下的 React/HTML 是**视觉规范参考**(像素级还原 + 交互),Flutter 实现以它们为蓝本、以本文件为令牌来源。 ## 快速开始 1. 新建 Flutter 工程,把本目录的 `pubspec.yaml` 覆盖到根目录(按需改 `name`)。 2. 拷贝:`pangolin_theme.dart` → `lib/`;`widgets/` 整个目录 → `lib/widgets/`;`main.dart` → `lib/`;`assets/*.svg` → 工程 `assets/`。 3. 自备 4 款字体的 ttf 放 `fonts/`(或改用 `google_fonts` 包),族名须与 `pubspec.yaml` 一致。 4. `flutter pub get` → `flutter run`。`main.dart` 已串好「登录 → 引导 → 主框架」可直接跑。 ## 文件 - `pubspec.yaml` — **工程清单模板**:已配好 `flutter_svg` / `lucide_icons` 依赖、4 个 SVG 资产、4 款字体声明(族名对齐 `PangolinFonts`)。拷到工程根目录,补字体 ttf,`flutter pub get` 即可。 - `main.dart` — **入口示例**:`runApp` + 明/暗主题 + 「登录 → 引导 → 主框架」`RootFlow` 串接,可直接跑通。 - `pangolin_theme.dart` — 全部令牌 + 明/暗 `ThemeData`: - `PangolinColors` — clay / sand / 语义色阶(const `Color`) - `PangolinScheme`(`ThemeExtension`)— 语义令牌(bg/surface/fg/accent/border/success…),含 `.light` / `.dark` - `PangolinSpacing`(4px 基准)、`PangolinRadius`、`PangolinMotion`(时长 + 缓动曲线) - `PangolinFonts`、`PangolinText`(字号阶)、`PangolinShadow`(暖色软阴影) - `PangolinTheme.light` / `PangolinTheme.dark` — 开箱即用 - `widgets/` — **核心组件 Dart 雏形**(纯样式,业务逻辑自接),全部读 `context.pangolin` 令牌: - `pangolin_icons.dart` — **Lucide 图标映射表**:`PangolinIcons.power` 等直用常量 + `PangolinIcons.byName('shield-check')` 查表(从 React `data-lucide` 名移植)。需 `lucide_icons` 包。 - `pangolin_button.dart` — `PangolinButton`(primary / secondary / ghost / danger,胶囊形) - `country_code.dart` — `CountryCode`(2 字母国家码块)、`SignalBars`(延迟信号条) - `status_pill.dart` — `StatusPill`(连接态 / PRO 等色点胶囊) - `connect_button.dart` — `ConnectButton`(核心连接键三态:off 轨道环 / connecting 旋转弧 / on 满环 + 计时) - `server_tile.dart` — `ServerTile` + `ServerInfo`(服务器列表行) - `plan_card.dart` — `PlanCard`(套餐卡,专业版渐变高亮 + 「最受欢迎」浮标) - `auth_screen.dart` — `AuthScreen`(登录 / 邮箱验证码注册,分屏式,带 `zh` 简单 i18n) - `onboarding_screen.dart` — `OnboardingScreen`(首次引导 `PageView`,3 屏可滑动 + 进度点 + 跳过) - `home_shell.dart` — `HomeShell`(主框架:底部 4 Tab 连接/节点/统计/账户 + 连接状态机 + 计时;各页骨架) - `account_screens.dart` — 账户子页:`PlansScreen`(套餐选择)、`DevicesScreen`(设备管理 + 移除)、`RedeemScreen`(兑换码 + 购买渠道)、`ContactScreen`(联系渠道 + 服务时间);均为带返回栏的独立页,`HomeShell` 账户页已 `push` 接入 - `pangolin_logo.dart` — `PangolinMark` / `PangolinBrandLockup` / `PangolinWordmark` / `PangolinAppIcon`(`flutter_svg` 加载 `assets/` 矢量 logo,深色自动反白) - `pangolin_widgets.dart` — 统一 `export` > 这些是**视觉雏形**:对应 React UI Kit 的同名组件,Flutter 工程师可直接拷贝/微调,接上真实状态与导航。图标已走 `PangolinIcons`(Lucide),与设计一致。 ## 接入 ```dart MaterialApp( theme: PangolinTheme.light, darkTheme: PangolinTheme.dark, themeMode: ThemeMode.system, // 跟随系统;也可由设置里的开关控制 ); ``` 读语义色(随明暗自动切换): ```dart final c = context.pangolin; // PangolinScheme Container(color: c.surface); Text('已连接', style: PangolinText.h3.copyWith(color: c.success)); ``` 令牌直取: ```dart PangolinColors.clay500 // 品牌主色 PangolinSpacing.x4 // 16 BorderRadius.circular(PangolinRadius.lg) AnimatedContainer(duration: PangolinMotion.base, curve: PangolinMotion.easeOut, ...) ``` 组件雏形(组合示例): ```dart import 'widgets/pangolin_widgets.dart'; // 连接键 ConnectButton(status: VpnStatus.on, elapsed: const Duration(seconds: 8048), onTap: toggle); // 服务器行 ServerTile( server: const ServerInfo(code: 'HK', name: '香港 · 流媒体', sub: 'Hong Kong', ping: 18), active: true, onTap: () {}, ); // 套餐卡(专业版高亮) PlanCard( name: '专业版', price: '¥25', period: '/月', popularLabel: '最受欢迎', featured: true, features: const ['80+ 全球节点', '无限流量 · 极速', '5 台设备同时在线'], ctaLabel: '立即升级', onPressed: () {}, ); PangolinButton(label: '连接', icon: PangolinIcons.power, onPressed: () {}); StatusPill(label: '已连接', status: PangolinStatus.connected); ``` 页面串接(登录 → 引导 → 主应用): ```dart enum AppStage { auth, onboarding, app } class _RootState extends State { AppStage stage = AppStage.auth; @override Widget build(BuildContext context) => switch (stage) { AppStage.auth => AuthScreen(onDone: () => setState(() => stage = AppStage.onboarding)), AppStage.onboarding => OnboardingScreen(onDone: () => setState(() => stage = AppStage.app)), AppStage.app => const HomeShell(), // 主框架:底部 4 Tab(连接/节点/统计/账户) }; } ``` ## 字体 在 `pubspec.yaml` 注册 **Sora**(display)、**Manrope**(正文/UI)、**Noto Sans SC**(中文)、**JetBrains Mono**(数据)。可用 `google_fonts` 包或打包本地字体;族名见 `PangolinFonts`。 ## 图标 UI Kit 用 Lucide(细线条)。Flutter 侧用 [`lucide_icons`](https://pub.dev/packages/lucide_icons) 包,经 `widgets/pangolin_icons.dart` 的映射表引用:`Icon(PangolinIcons.power)`。`pubspec.yaml` 加 `lucide_icons: ^0.x`。某常量名若在你的包版本缺失,按 IDE 提示替换为最接近名即可(文件内已注明 Lucide 原名)。 ## Logo / 品牌标(SVG) 矢量 logo 在 `assets/`(`logo-mark.svg` clay 标、`logo-mark-white.svg` 反白标、`logo-wordmark.svg` 字标、`app-icon.svg` App 图标)。用 [`flutter_svg`](https://pub.dev/packages/flutter_svg) 加载,封装在 `widgets/pangolin_logo.dart`: - `PangolinMark(size: 28)` — 仅标记,**深色主题自动用反白版**(可 `forceLight`/`forceDark`) - `PangolinBrandLockup(zh: true)` — 标记 + 「穿山甲 / Pangolin」(随主题变色 + 双语,顶栏用) - `PangolinWordmark(height: 28)` — 横版字标锁版(浅背景) - `PangolinAppIcon(size: 64)` — App 图标(自动圆角) 接入步骤: 1. `pubspec.yaml` 加依赖与资产: ```yaml dependencies: flutter_svg: ^2.0.0 flutter: assets: - assets/logo-mark.svg - assets/logo-mark-white.svg - assets/logo-wordmark.svg - assets/app-icon.svg ``` 2. 把本目录的 `assets/*.svg` 拷进你工程的 `assets/`(若用别的前缀,改 `pangolin_logo.dart` 顶部的 `_base`)。 3. `AuthScreen` / `HomeShell` 顶栏已用 `PangolinMark` / `PangolinBrandLockup`,无需再改。 4. App 启动图标 / 桌面图标用 `app-icon.svg` 导出 PNG(`flutter_launcher_icons` 包)。 ## 规则(务必遵守) - 颜色只用语义令牌,组件天然适配明/暗,不要硬编码十六进制。 - 暖色基调:表面是暖白/暖 espresso,**不要纯白纯黑**大面积填充。 - 圆角偏大、阴影柔和暖调;状态用「色点 + 文字」,不用 emoji;国家用 2 字母码块,不用 emoji 国旗。 - 界面单语言显示(中文**或** EN),由设置切换;不要中英并排。 - App 内不放支付表单;走兑换码 + 外部渠道。 > ⚠️ 字体均为开源字体(Google Fonts),作为本品牌正式选定字体。若你已有授权品牌字体,替换族名与文件即可。