diff --git a/client/lib/pangolin_theme.dart b/client/lib/pangolin_theme.dart index 62051af..9d78795 100644 --- a/client/lib/pangolin_theme.dart +++ b/client/lib/pangolin_theme.dart @@ -24,6 +24,27 @@ import 'package:google_fonts/google_fonts.dart'; import 'pangolin_tokens.gen.dart'; export 'pangolin_tokens.gen.dart'; +/// 自定义容器(自带圆角/边框/聚焦态)里嵌 [TextField] 时用此装饰: +/// 彻底关掉主题 [inputDecorationTheme] 的边框/填充泄漏。 +/// +/// 坑:主题里设了 `focusedBorder: OutlineInputBorder(accent)` + `filled:true`。 +/// 字段只写 `border: InputBorder.none` **不覆盖 focusedBorder** 时,聚焦瞬间主题的 +/// 橙色 OutlineInputBorder + 填充会画到内层 TextField 上,与外层容器圆角错位/被裁 +/// (登录/注册的邮箱·密码·验证码、节点页搜索框聚焦时左右各缺一截即此因)。 +/// 聚焦指示交给外层容器自己负责(如 [Border.all(accent)])。 +/// +/// 注意:只压边框、不动 `filled`/`fillColor`——未聚焦态外观与改前完全一致(不动 golden), +/// 漏出的橙框只来自 `focusedBorder`(未聚焦态早已解析为无边框)。 +const InputDecoration kBareInput = InputDecoration( + isCollapsed: true, + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + disabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + focusedErrorBorder: InputBorder.none, +); + /// ── Semantic tokens, resolved per brightness ─────────────────────── @immutable class PangolinScheme extends ThemeExtension { diff --git a/client/lib/screens/nodes_page.dart b/client/lib/screens/nodes_page.dart index 23a5aee..f93e3fb 100644 --- a/client/lib/screens/nodes_page.dart +++ b/client/lib/screens/nodes_page.dart @@ -165,10 +165,10 @@ class _SearchBox extends StatelessWidget { child: TextField( onChanged: onChanged, style: PangolinText.sm.copyWith(color: c.fg1, fontSize: 15), - decoration: InputDecoration( - isCollapsed: true, + // kBareInput 关掉主题 inputDecorationTheme 的边框/填充泄漏(否则聚焦时 + // 橙色 OutlineInputBorder 会画到内层 TextField 上、与搜索框圆角错位/被裁)。 + decoration: kBareInput.copyWith( contentPadding: const EdgeInsets.symmetric(vertical: 12), - border: InputBorder.none, hintText: hint, hintStyle: PangolinText.sm.copyWith(color: c.fg3, fontSize: 15), ), diff --git a/client/lib/widgets/account_screens.dart b/client/lib/widgets/account_screens.dart index ab19b93..ed60b21 100644 --- a/client/lib/widgets/account_screens.dart +++ b/client/lib/widgets/account_screens.dart @@ -260,7 +260,8 @@ class _RedeemScreenState extends ConsumerState { controller: _code, textCapitalization: TextCapitalization.characters, style: PangolinText.mono.copyWith(color: c.fg1, letterSpacing: 1.5), - decoration: InputDecoration(border: InputBorder.none, isCollapsed: true, contentPadding: const EdgeInsets.symmetric(vertical: 13), hintText: t.redeemPh, hintStyle: PangolinText.sm.copyWith(color: c.fg3)), + // kBareInput 关掉主题边框/填充泄漏(聚焦时橙框错位/被裁),聚焦态交给外层 Border。 + decoration: kBareInput.copyWith(contentPadding: const EdgeInsets.symmetric(vertical: 13), hintText: t.redeemPh, hintStyle: PangolinText.sm.copyWith(color: c.fg3)), onChanged: (_) => setState(() {}), ), )), diff --git a/client/lib/widgets/auth_screen.dart b/client/lib/widgets/auth_screen.dart index a6384d1..b48c830 100644 --- a/client/lib/widgets/auth_screen.dart +++ b/client/lib/widgets/auth_screen.dart @@ -329,8 +329,10 @@ class _AuthScreenState extends ConsumerState ]); } + // kBareInput 关掉主题 inputDecorationTheme 的边框/填充泄漏(否则聚焦时橙色 + // OutlineInputBorder 会画到内层 TextField 上、与外层容器错位/被裁)。 InputDecoration get _bare => - const InputDecoration(border: InputBorder.none, isCollapsed: true, contentPadding: EdgeInsets.symmetric(vertical: 13)); + kBareInput.copyWith(contentPadding: const EdgeInsets.symmetric(vertical: 13)); // 密码输入 + 显示/隐藏切换(眼睛按钮)。 Widget _pwInput(PangolinScheme c, String hint) => Row(children: [