diff --git a/lib/pages/audit.dart b/lib/pages/audit.dart index 422c0ee..07dd7cf 100644 --- a/lib/pages/audit.dart +++ b/lib/pages/audit.dart @@ -436,12 +436,26 @@ class _LiveStatusBar extends StatelessWidget { pulsing: live, ), const SizedBox(width: ChainSpace.sm), - Text( - live ? l.auditLiveStatus(eventCount) : l.auditDisconnected(error!), - style: theme.textTheme.bodySmall?.copyWith( - color: theme.colorScheme.onSurfaceVariant, + // Disconnected → SelectableText so the raw error is copyable + // (it's the only place the underlying failure is surfaced; + // the empty-state below shows only a generic hint). + if (live) + Text( + l.auditLiveStatus(eventCount), + style: theme.textTheme.bodySmall?.copyWith( + color: theme.colorScheme.onSurfaceVariant, + ), + ) + else + Flexible( + child: SelectableText( + l.auditDisconnected(error!), + maxLines: 2, + style: theme.textTheme.bodySmall?.copyWith( + color: theme.colorScheme.onSurfaceVariant, + ), + ), ), - ), const Spacer(), if (live) Row( diff --git a/lib/widgets/chain_settings_dialog.dart b/lib/widgets/chain_settings_dialog.dart index b94b58d..54c05a7 100644 --- a/lib/widgets/chain_settings_dialog.dart +++ b/lib/widgets/chain_settings_dialog.dart @@ -491,12 +491,8 @@ class _FaiSettingsDialogState extends State { ), if (_error != null) ...[ const SizedBox(height: ChainSpace.md), - Text( - _error!, - style: theme.textTheme.bodySmall?.copyWith( - color: theme.colorScheme.error, - ), - ), + // Copyable — errors must be selectable + one-tap copyable. + ChainErrorBox(text: _error!, isError: true, maxHeight: 200), ], const SizedBox(height: ChainSpace.md), Container( @@ -2490,12 +2486,8 @@ class _DefaultScopePanelState extends State<_DefaultScopePanel> { ], if (_error != null) ...[ const SizedBox(height: ChainSpace.sm), - Text( - _error!, - style: theme.textTheme.bodySmall?.copyWith( - color: theme.colorScheme.error, - ), - ), + // Copyable — errors must be selectable + one-tap copyable. + ChainErrorBox(text: _error!, isError: true, maxHeight: 200), ], ], ],