Fix assistant artifact toggle overlap

This commit is contained in:
Haitao Pan 2026-03-25 18:26:09 +08:00
parent f61548007c
commit b59bc37f2f
3 changed files with 46 additions and 5 deletions

View File

@ -34,6 +34,7 @@ const double _assistantHorizontalPaneGap = 2;
const double _assistantVerticalResizeHandleHeight = 10;
const double _assistantArtifactPaneMinWidth = 280;
const double _assistantArtifactPaneDefaultWidth = 360;
const double _assistantCollapsedArtifactToggleClearance = 56;
typedef AssistantClipboardImageReader = Future<XFile?> Function();
@ -446,6 +447,9 @@ class _AssistantPageState extends State<AssistantPage> {
currentTask: currentTask,
items: timelineItems,
messageViewMode: controller.currentAssistantMessageViewMode,
topTrailingInset: _artifactPaneCollapsed
? _assistantCollapsedArtifactToggleClearance
: 0,
scrollController: _conversationController,
onOpenDetail: widget.onOpenDetail,
onFocusComposer: _focusComposer,
@ -605,8 +609,8 @@ class _AssistantPageState extends State<AssistantPage> {
Positioned.fill(child: panel),
if (_artifactPaneCollapsed)
Positioned(
right: AppSpacing.sm,
top: AppSpacing.lg,
right: 0,
top: 0,
child: AssistantArtifactSidebarRevealButton(
onTap: () {
setState(() {
@ -1819,6 +1823,7 @@ class _ConversationArea extends StatelessWidget {
required this.currentTask,
required this.items,
required this.messageViewMode,
required this.topTrailingInset,
required this.scrollController,
required this.onOpenDetail,
required this.onFocusComposer,
@ -1832,6 +1837,7 @@ class _ConversationArea extends StatelessWidget {
final _AssistantTaskEntry currentTask;
final List<_TimelineItem> items;
final AssistantMessageViewMode messageViewMode;
final double topTrailingInset;
final ScrollController scrollController;
final ValueChanged<DetailPanelData> onOpenDetail;
final VoidCallback onFocusComposer;
@ -1852,7 +1858,7 @@ class _ConversationArea extends StatelessWidget {
child: Column(
children: [
Padding(
padding: const EdgeInsets.fromLTRB(10, 8, 10, 8),
padding: EdgeInsets.fromLTRB(10, 8, 10 + topTrailingInset, 8),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [

View File

@ -425,7 +425,10 @@ class AssistantArtifactSidebarRevealButton extends StatelessWidget {
],
),
borderRadius: BorderRadius.circular(AppRadius.sidebar),
border: Border.all(color: palette.chromeStroke),
border: Border.all(
color: palette.chromeStroke.withValues(alpha: 0.88),
width: 0.9,
),
boxShadow: [palette.chromeShadowAmbient],
),
child: Icon(

View File

@ -266,6 +266,36 @@ void main() {
expect(find.byKey(const Key('assistant-artifact-pane')), findsNothing);
});
testWidgets(
'AssistantPage keeps the collapsed artifact toggle clear of top toolbar controls',
(WidgetTester tester) async {
final controller = await createTestController(tester);
await pumpPage(
tester,
child: AssistantPage(controller: controller, onOpenDetail: (_) {}),
platform: TargetPlatform.macOS,
);
final toggle = find.byKey(const Key('assistant-artifact-pane-toggle'));
final viewMode = find.byKey(
const Key('assistant-message-view-mode-button'),
);
final connectionChip = find.byKey(const Key('assistant-connection-chip'));
expect(toggle, findsOneWidget);
expect(viewMode, findsOneWidget);
expect(connectionChip, findsOneWidget);
final toggleRect = tester.getRect(toggle);
final viewModeRect = tester.getRect(viewMode);
final connectionRect = tester.getRect(connectionChip);
expect(toggleRect.overlaps(viewModeRect), isFalse);
expect(toggleRect.overlaps(connectionRect), isFalse);
},
);
testWidgets(
'AssistantPage shows Single Agent provider selector on the right',
(WidgetTester tester) async {},
@ -567,7 +597,9 @@ void main() {
await _waitForCondition(
() =>
controller
.assistantImportedSkillsForSession(controller.currentSessionKey)
.assistantImportedSkillsForSession(
controller.currentSessionKey,
)
.length ==
3,
);