// 暖记设计常量 — 间距 / 动画 / 触摸目标 import 'package:flutter/animation.dart'; class DesignTokens { DesignTokens._(); // ===== 间距(4px 基准,9 级)===== static const double spacing4 = 4; static const double spacing8 = 8; static const double spacing12 = 12; static const double spacing16 = 16; static const double spacing20 = 20; static const double spacing24 = 24; static const double spacing32 = 32; static const double spacing40 = 40; static const double spacing48 = 48; // ===== 安全区 & 布局常量(对齐 spec §1)===== static const double safeTop = 54; // iPhone Dynamic Island static const double safeBottom = 34; // Home Indicator static const double tabHeight = 56; // 底部 Tab 栏 static const double touchMin = 44; // WCAG 最小触控目标 static const double containerMax = 390; // 移动端容器宽度 // ===== 动画时长 ===== static const Duration animFast = Duration(milliseconds: 150); static const Duration animNormal = Duration(milliseconds: 300); static const Duration animSlow = Duration(milliseconds: 500); // ===== 弹性曲线 cubic-bezier(0.34, 1.56, 0.64, 1) ===== static const Curve warmCurve = Curves.easeOutBack; // ===== 列表/网格 ===== static const int journalGridCrossAxisCountMobile = 2; static const int journalGridCrossAxisCountTablet = 3; static const int journalGridCrossAxisCountDesktop = 4; // ===== 日记限制 ===== static const int maxTagsPerJournal = 10; static const int maxTitleLength = 100; static const int maxStrokesPerElement = 5000; static const int maxUndoSteps = 50; // ===== 班级码 ===== static const int classCodeLength = 6; static const int classCodeMaxAttempts = 5; static const int classCodeLockoutMinutes = 30; }