feat: F024 global AI assistant — contextual decision intelligence drawer

Wires the existing "AI Assistent" button in the TopBar and adds a 420px
slide-in drawer with context-aware suggestions, message thread, loading
animation, and action cards requiring manual confirmation. Template-based
mock service returns German-language answers keyed by route + question
keywords — no real LLM calls, no invented facts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-17 13:27:33 +02:00
parent 71f4b1eeb6
commit 30e840489d
13 changed files with 1222 additions and 0 deletions
@@ -0,0 +1,51 @@
import { Box, Typography } from '@mui/material'
export function AssistantLoadingState() {
return (
<Box sx={{ display: 'flex', gap: 1, px: 2, py: 1.5, alignItems: 'flex-start' }}>
<Box
sx={{
width: 28,
height: 28,
borderRadius: '50%',
bgcolor: '#4f46e5',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
}}
>
<Typography variant="caption" sx={{ color: 'white', fontWeight: 700, fontSize: '0.625rem' }}>AI</Typography>
</Box>
<Box
sx={{
bgcolor: '#f1f5f9',
borderRadius: '0 8px 8px 8px',
px: 1.5,
py: 1,
display: 'flex',
gap: 0.5,
alignItems: 'center',
}}
>
{[0, 1, 2].map(i => (
<Box
key={i}
sx={{
width: 6,
height: 6,
borderRadius: '50%',
bgcolor: '#94a3b8',
animation: 'bounce 1.2s ease-in-out infinite',
animationDelay: `${i * 0.2}s`,
'@keyframes bounce': {
'0%, 80%, 100%': { transform: 'scale(0.8)', opacity: 0.5 },
'40%': { transform: 'scale(1.2)', opacity: 1 },
},
}}
/>
))}
</Box>
</Box>
)
}