Replace sidebar logo with chevron icon

This commit is contained in:
Haitao Pan 2026-03-25 17:48:22 +08:00
parent 6a0b86cadd
commit d8cd980433
3 changed files with 83 additions and 10 deletions

View File

@ -8,7 +8,6 @@ import '../theme/app_palette.dart';
import '../theme/app_theme.dart';
import '../widgets/detail_drawer.dart';
import '../widgets/pane_resize_handle.dart';
import '../widgets/app_brand_logo.dart';
import '../widgets/sidebar_navigation.dart';
import 'app_controller.dart';
import 'workspace_page_registry.dart';
@ -470,8 +469,8 @@ class _SidebarRevealRailState extends State<_SidebarRevealRail> {
boxShadow: _hovered ? [palette.chromeShadowLift] : const [],
),
child: _hovered
? DoorLogoIcon(
side: DoorLogoSide.left,
? Icon(
Icons.chevron_right_rounded,
size: 16,
color: palette.textMuted,
)

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'app_brand_logo.dart';
import '../i18n/app_language.dart';
import '../models/app_models.dart';
import '../theme/app_palette.dart';
@ -224,21 +223,64 @@ class SidebarHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
final content = AppBrandLogo(
final content = _SidebarHeaderChevron(
size: isCollapsed ? 36 : 28,
borderRadius: isCollapsed ? 10 : 8,
);
final alignedContent = Align(
alignment: Alignment.centerRight,
child: content,
);
if (onTap == null) {
return content;
return alignedContent;
}
return Tooltip(
message: appText('展开导航', 'Expand sidebar'),
child: InkWell(
borderRadius: BorderRadius.circular(AppRadius.button),
onTap: onTap,
child: Padding(padding: EdgeInsets.zero, child: content),
child: Align(
alignment: Alignment.centerRight,
child: InkWell(
borderRadius: BorderRadius.circular(AppRadius.button),
onTap: onTap,
child: Padding(padding: EdgeInsets.zero, child: content),
),
),
);
}
}
class _SidebarHeaderChevron extends StatelessWidget {
const _SidebarHeaderChevron({required this.size, required this.borderRadius});
final double size;
final double borderRadius;
@override
Widget build(BuildContext context) {
final palette = context.palette;
return Container(
width: size,
height: size,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
palette.chromeHighlight.withValues(alpha: 0.9),
palette.chromeSurface,
],
),
borderRadius: BorderRadius.circular(borderRadius),
border: Border.all(color: palette.chromeStroke),
boxShadow: [palette.chromeShadowAmbient],
),
child: Center(
child: Icon(
Icons.chevron_right_rounded,
size: size * 0.72,
color: palette.textSecondary,
),
),
);
}

View File

@ -6,6 +6,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:xworkmate/i18n/app_language.dart';
import 'package:xworkmate/models/app_models.dart';
import 'package:xworkmate/theme/app_theme.dart';
import 'package:xworkmate/widgets/app_brand_logo.dart';
import 'package:xworkmate/widgets/sidebar_navigation.dart';
void main() {
@ -154,4 +155,35 @@ void main() {
expect(selected, WorkspaceDestination.settings);
},
);
testWidgets('SidebarNavigation header uses chevron instead of brand logo', (
WidgetTester tester,
) async {
await tester.pumpWidget(
MaterialApp(
theme: AppTheme.light(),
home: Scaffold(
body: SidebarNavigation(
currentSection: WorkspaceDestination.assistant,
sidebarState: AppSidebarState.expanded,
appLanguage: AppLanguage.zh,
themeMode: ThemeMode.light,
onSectionChanged: (_) {},
onToggleLanguage: () {},
onCycleSidebarState: () {},
onExpandFromCollapsed: () {},
onOpenHome: () {},
onOpenAccount: () {},
onOpenThemeToggle: () {},
accountName: 'Tester',
accountSubtitle: 'Workspace',
),
),
),
);
await tester.pumpAndSettle();
expect(find.byIcon(Icons.chevron_right_rounded), findsOneWidget);
expect(find.byType(AppBrandLogo), findsNothing);
});
}