feat: initial IQAI multi-model AI dashboard

- Express backend with Replicate API proxy (chat, models, account, search)
- React + Vite + Tailwind frontend with custom Midnight Violet color scheme
- @mention autocomplete to route messages to specific models
- Parallel multi-model queries with model selection in sidebar
- DuckDuckGo web search context injection
- Model manager UI (add/edit/remove Replicate models)
- Per-model system instructions per conversation
- Replicate account info display in sidebar
- Conversation history with local persistence (Zustand)
- Full Docker deployment (backend + nginx-served frontend)
- Montserrat + Poppins fonts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Malin
2026-04-16 13:12:40 +02:00
commit 71965939a1
31 changed files with 2399 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,jsx}'],
theme: {
extend: {
fontFamily: {
sans: ['Poppins', 'Inter', 'system-ui', 'sans-serif'],
display: ['Montserrat', 'Poppins', 'sans-serif'],
mono: ['JetBrains Mono', 'Fira Code', 'monospace']
},
colors: {
// Brand palette
apricot: '#f9dbbd',
tangerine: '#fca17d',
blush: '#da627d',
grape: '#9a348e',
midnight: '#0d0628',
// Surface shades (midnight-violet based)
surface: {
0: '#0d0628',
1: '#110830',
2: '#180d40',
3: '#1e1150',
4: '#261560'
}
},
backgroundImage: {
'brand-gradient': 'linear-gradient(135deg, #f9dbbd, #fca17d, #da627d, #9a348e, #0d0628)',
'brand-gradient-r': 'linear-gradient(90deg, #9a348e, #da627d, #fca17d)',
'brand-gradient-v': 'linear-gradient(180deg, #9a348e 0%, #0d0628 100%)',
'glow-grape': 'radial-gradient(circle at center, #9a348e40, transparent 70%)',
'glow-blush': 'radial-gradient(circle at center, #da627d30, transparent 70%)'
},
boxShadow: {
'grape': '0 0 20px #9a348e40',
'blush': '0 0 20px #da627d30',
'tangerine': '0 0 20px #fca17d30'
},
animation: {
'fade-in': 'fadeIn 0.2s ease-out',
'slide-up': 'slideUp 0.25s ease-out',
'glow-pulse': 'glowPulse 3s ease-in-out infinite'
},
keyframes: {
fadeIn: { from: { opacity: 0 }, to: { opacity: 1 } },
slideUp: { from: { opacity: 0, transform: 'translateY(10px)' }, to: { opacity: 1, transform: 'translateY(0)' } },
glowPulse: {
'0%, 100%': { boxShadow: '0 0 15px #9a348e30' },
'50%': { boxShadow: '0 0 30px #9a348e60' }
}
}
}
},
plugins: []
};