// pangolin_logo.dart — 品牌标 / 字标 / App 图标(SVG) // 用 flutter_svg 加载 assets/ 下的矢量 logo,自动适配明暗主题。 // // 依赖:pubspec.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 // // 资产路径:把本目录上一级的 assets/*.svg 拷进你的 Flutter 工程 assets/。 // 若放在其他包/前缀下,改 _base 即可。 import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import '../pangolin_theme.dart'; const String _base = 'assets'; /// 仅标记(行走穿山甲)。深色主题自动用反白版。 class PangolinMark extends StatelessWidget { const PangolinMark({super.key, this.size = 28, this.forceLight, this.forceDark}); final double size; final bool? forceLight; // 强制浅色锁版(clay 标) final bool? forceDark; // 强制深色锁版(反白标) @override Widget build(BuildContext context) { final isDark = forceDark ?? (forceLight == true ? false : Theme.of(context).brightness == Brightness.dark); final asset = isDark ? '$_base/logo-mark-white.svg' : '$_base/logo-mark.svg'; return SvgPicture.asset(asset, width: size, height: size); } } /// 标记 + 字标(横版锁版)。深色下文字需反白时建议改用 PangolinMark + Text 自绘, /// 因 wordmark.svg 内文字为深色;此处提供浅背景用法。 class PangolinWordmark extends StatelessWidget { const PangolinWordmark({super.key, this.height = 28}); final double height; @override Widget build(BuildContext context) => SvgPicture.asset('$_base/logo-wordmark.svg', height: height); } /// App 图标(clay 渐变圆角方 + 白色穿山甲)。圆角随尺寸。 class PangolinAppIcon extends StatelessWidget { const PangolinAppIcon({super.key, this.size = 64}); final double size; @override Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(size * 0.22), child: SvgPicture.asset('$_base/app-icon.svg', width: size, height: size), ); } } /// 顶栏品牌锁版:标记 + 「穿山甲 / Pangolin」字样(用本地字体,随主题变色)。 /// 比直接用 wordmark.svg 更灵活(可双语 + 深浅自适应)。 class PangolinBrandLockup extends StatelessWidget { const PangolinBrandLockup({super.key, this.zh = true, this.markSize = 26}); final bool zh; final double markSize; @override Widget build(BuildContext context) { final c = context.pangolin; return Row(mainAxisSize: MainAxisSize.min, children: [ PangolinMark(size: markSize), const SizedBox(width: 9), Text(zh ? '穿山甲' : 'Pangolin', style: PangolinText.h3.copyWith(color: c.fg1, fontFamily: PangolinFonts.display, fontWeight: FontWeight.w700)), ]); } }