Initial commit: EmailToChat — multi-channel email manager with AI
Desktop app (Electron + Vite + React + TypeScript) that receives email via IMAP, sends/forwards via SMTP, Telegram (Bot API + MTProto user account) and WhatsApp (whatsapp-web.js), with AI integration (Anthropic, OpenAI, Ollama) for auto-classification, summary, structured extraction and reply drafts. Features: - Multi-account IMAP/SMTP with Gmail OAuth2 (loopback flow) + App Password preset - Telegram Bot API via telegraf, with chat discovery from getUpdates - Telegram MTProto via gram.js for sending to phone numbers like WhatsApp - WhatsApp via whatsapp-web.js with QR-code session (locally generated PNG) - Forwarding engine with rule-based filters incl. AI category match - SQLite persistence (better-sqlite3) with idempotent migrations - Contact picker with autocomplete, CSV/vCard import, search - Dark mode (light/dark/system) with futuristic glass-morphism UI - Settings tabbed: Email Accounts / Telegram / WhatsApp / AI / OAuth creds / Preferences Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
620b8fca67
53 files changed
+18873
No files matched your search
@@ -0,0 +1,97 @@
|
||||
import defaultTheme from 'tailwindcss/defaultTheme'
|
||||
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
darkMode: 'class',
|
||||
content: ['./src/renderer/index.html', './src/renderer/src/**/*.{ts,tsx}'],
|
||||
theme: {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
sans: ['Inter', ...defaultTheme.fontFamily.sans],
|
||||
display: ['"Space Grotesk"', 'Inter', ...defaultTheme.fontFamily.sans],
|
||||
mono: ['"JetBrains Mono"', ...defaultTheme.fontFamily.mono]
|
||||
},
|
||||
colors: {
|
||||
brand: {
|
||||
50: '#eef4ff',
|
||||
100: '#d9e6ff',
|
||||
200: '#bcd2ff',
|
||||
300: '#8eb4ff',
|
||||
400: '#598bff',
|
||||
500: '#3563ff',
|
||||
600: '#2046f5',
|
||||
700: '#1a35d8',
|
||||
800: '#1c2faf',
|
||||
900: '#1c2c87'
|
||||
},
|
||||
neon: {
|
||||
cyan: '#06b6d4',
|
||||
blue: '#3b82f6',
|
||||
purple: '#a855f7',
|
||||
pink: '#ec4899',
|
||||
green: '#10b981'
|
||||
},
|
||||
ink: {
|
||||
50: '#f8fafc',
|
||||
100: '#f1f5f9',
|
||||
200: '#e2e8f0',
|
||||
300: '#cbd5e1',
|
||||
400: '#94a3b8',
|
||||
500: '#64748b',
|
||||
600: '#475569',
|
||||
700: '#334155',
|
||||
800: '#1e293b',
|
||||
900: '#0f172a',
|
||||
950: '#020617'
|
||||
}
|
||||
},
|
||||
boxShadow: {
|
||||
glow: '0 0 30px -8px rgba(99, 102, 241, 0.45)',
|
||||
'glow-sm': '0 0 15px -4px rgba(99, 102, 241, 0.35)',
|
||||
'glow-cyan': '0 0 30px -8px rgba(6, 182, 212, 0.5)',
|
||||
'glow-purple': '0 0 30px -8px rgba(168, 85, 247, 0.5)',
|
||||
'glow-success': '0 0 20px -6px rgba(16, 185, 129, 0.6)',
|
||||
'glow-danger': '0 0 20px -6px rgba(239, 68, 68, 0.6)',
|
||||
'inset-glow': 'inset 0 1px 0 0 rgba(255, 255, 255, 0.08)',
|
||||
'depth':
|
||||
'0 10px 30px -10px rgba(15, 23, 42, 0.1), 0 4px 6px -2px rgba(15, 23, 42, 0.04)',
|
||||
'depth-lg':
|
||||
'0 25px 50px -12px rgba(15, 23, 42, 0.18), 0 8px 16px -6px rgba(15, 23, 42, 0.08)'
|
||||
},
|
||||
animation: {
|
||||
'fade-in': 'fadeIn 0.25s ease-out',
|
||||
'slide-up': 'slideUp 0.3s cubic-bezier(0.16, 1, 0.3, 1)',
|
||||
'glow-pulse': 'glowPulse 2.5s ease-in-out infinite',
|
||||
'shimmer': 'shimmer 2s linear infinite',
|
||||
'gradient-x': 'gradientX 6s ease infinite'
|
||||
},
|
||||
keyframes: {
|
||||
fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' } },
|
||||
slideUp: {
|
||||
'0%': { transform: 'translateY(12px)', opacity: '0' },
|
||||
'100%': { transform: 'translateY(0)', opacity: '1' }
|
||||
},
|
||||
glowPulse: {
|
||||
'0%, 100%': { opacity: '0.7', filter: 'brightness(1)' },
|
||||
'50%': { opacity: '1', filter: 'brightness(1.15)' }
|
||||
},
|
||||
shimmer: {
|
||||
'0%': { backgroundPosition: '-200% 0' },
|
||||
'100%': { backgroundPosition: '200% 0' }
|
||||
},
|
||||
gradientX: {
|
||||
'0%, 100%': { backgroundPosition: '0% 50%' },
|
||||
'50%': { backgroundPosition: '100% 50%' }
|
||||
}
|
||||
},
|
||||
backgroundImage: {
|
||||
'gradient-radial': 'radial-gradient(circle at top left, var(--tw-gradient-stops))',
|
||||
'mesh-light':
|
||||
'radial-gradient(at 0% 0%, rgba(99,102,241,0.10) 0, transparent 50%), radial-gradient(at 100% 0%, rgba(168,85,247,0.08) 0, transparent 50%), radial-gradient(at 100% 100%, rgba(6,182,212,0.08) 0, transparent 50%)',
|
||||
'mesh-dark':
|
||||
'radial-gradient(at 0% 0%, rgba(99,102,241,0.22) 0, transparent 50%), radial-gradient(at 100% 0%, rgba(168,85,247,0.18) 0, transparent 50%), radial-gradient(at 100% 100%, rgba(6,182,212,0.15) 0, transparent 50%)'
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: []
|
||||
}
|
||||
Reference in new issue
Block a user