/// Renders the Task Selection Modal widget for the FocusFlow Flutter UI. library; import 'package:flutter/material.dart'; import '../models/today_screen_models.dart'; import '../theme/focus_flow_tokens.dart'; import 'timeline/difficulty_bars.dart'; import 'timeline/reward_icon.dart'; part 'task_selection/action_button.dart'; part 'task_selection/header_metadata.dart'; part 'task_selection/info_tile.dart'; part 'task_selection/modal_accent.dart'; part 'task_selection/modal_status_button.dart'; /// Modal shown when a selectable timeline task card is opened. class TaskSelectionModal extends StatelessWidget { /// Creates a task selection modal for [card]. const TaskSelectionModal({ required this.card, required this.onClose, this.onStatusPressed, super.key, }); /// Card model whose details and actions should be displayed. final TimelineCardModel card; /// Callback invoked when the modal should close. final VoidCallback onClose; /// Callback invoked when the status circle should toggle completion. final VoidCallback? onStatusPressed; @override Widget build(BuildContext context) { final accent = _accentFor(card.visualKind); return Material( color: Colors.transparent, child: Container( key: const ValueKey('task-selection-modal'), width: 548, padding: const EdgeInsets.fromLTRB(24, 22, 24, 20), decoration: BoxDecoration( color: FocusFlowTokens.elevatedPanel.withValues(alpha: 0.98), borderRadius: BorderRadius.circular(FocusFlowTokens.modalRadius), border: Border.all(color: accent.withValues(alpha: 0.86)), ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ _ModalStatusButton( card: card, color: accent, onPressed: onStatusPressed, ), const SizedBox(width: 28), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( card.title, style: const TextStyle( color: FocusFlowTokens.textPrimary, fontSize: FocusFlowTokens.modalTitleSize, fontWeight: FontWeight.w800, ), ), const SizedBox(height: 6), _HeaderMetadata(card: card), ], ), ), IconButton( key: const ValueKey('close-task-modal'), onPressed: onClose, style: IconButton.styleFrom( backgroundColor: FocusFlowTokens.glassPanelStrong, foregroundColor: FocusFlowTokens.textPrimary, ), icon: const Icon(Icons.close), ), ], ), const SizedBox(height: 26), Row( children: [ Expanded( child: _InfoTile( label: card.rewardLabel, child: RewardIcon(color: FocusFlowTokens.accentMagenta), ), ), const SizedBox(width: 28), Expanded( child: _InfoTile( label: card.effortLabel, child: DifficultyBars( difficulty: card.difficultyIconToken, color: FocusFlowTokens.restPurple, ), ), ), ], ), const SizedBox(height: 30), GridView.count( crossAxisCount: 2, crossAxisSpacing: 26, mainAxisSpacing: 16, childAspectRatio: 4.1, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: const [ _ActionButton(icon: Icons.check, label: 'Done'), _ActionButton(icon: Icons.arrow_forward, label: 'Push'), _ActionButton( icon: Icons.inventory_2_outlined, label: 'Move to Backlog', ), _ActionButton(icon: Icons.apps, label: 'Break up'), ], ), const SizedBox(height: 14), const Text( 'Options apply after confirmation.', style: TextStyle(color: FocusFlowTokens.textMuted, fontSize: 14), ), ], ), ), ); } }